news 2026/10/1 2:46:38

初识C语言:函数的定义、参数、调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初识C语言:函数的定义、参数、调用

1.什么是函数

(1)定义:

函数即子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。负责完成某项特定的任务,与其他代码相比,有相对的独立性

2.C语言中的函数分类

(1)库函数:C语言自带的函数

总结C语言中,简单常见的库函数:
  • IO函数
  • 字符串操作函数
  • 字符操作函数
  • 内存操作函数
  • 时间/日期操作函数
  • 数学函数
  • 其他函数

比如:

a.strcpy()函数

char * strcpy ( char * destination, const char * source ); //函数原型
int main() { char arr1[20] = {0}; char arr2[] = {"你好呀!!!"}; strcpy(arr1,arr2); //(目标数组,源头数组) printf("%s\n",arr1); return 0; }

b.memset()函数

void * memset(void * prt ,int value, size_t num); //函数原型
int main() { char arr[20] = {"hello world"}; memset(arr,'1',5); // 没有指定从数组哪个位置开始替换,默认为首个元素,即下标为 0 // memset(arr+5,'a',3); // 指定从数组元素下标为 5开始替换===> helloaaarld printf("%s\n",arr); return 0; } // ===> 11111 world

(2)自定义函数

和库函数一样,有函数名、返回值类型和函数参数(一般有)。格式如下:

re_type fun_name(para1, *) // re_type:返回值类型 ; fun_name:函数名; para1:函数参数 //函数体: { statement; //语句项 }

举例:写一个函数交换两个整型变量的内容

void Swap(int x,int y) { int temp = 0; temp = x; x = y; y = temp; } int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); printf("交换前:%d, %d\n",a,b); // 交换 Swap(a,b); printf("交换后:%d, %d\n",a,b); } // ===> 交换前: 10 20 // 交换后: 10 20

解引用交换值:

void Swap(int *px,int *py) { //*:解引用操作符, *px ,即将 px指针所指向的地址中的内容/值取出来(px指向的元素),a => *px,即取a的值 //*px: 包括了地址内所存的内容(a的值) int temp = 0; temp = *px; // temp = *py 的值 temp里面存的是从px这个地址取回来的值,px是地址,*取内容,&取地址 *px = *py; // *px 所指地址的内容 = *py 所指地址的内容 *py = temp; // *py 所指地址的内容 = *py的值 } int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); printf("交换前:%d, %d\n",a,b); // 交换 Swap(&a,&b); // 获取地址,把a,b的地址中的值进行更改 在地址中改值 printf("交换后:%d, %d\n",a,b); }

(3)总结:(需要传地址/不需要传地址)

需要对实参进行修改时,传地址(使用指针)

3.函数的参数( 形参和实参命名可以一致 )

  • 当实参传值给形参(具有独立的空间)时,形参是实参的一份临时拷贝
  • 对形参的修改不会影响实参

(1)实际参数:真是传给函数的参数(即调用函数时,括号中的内容)

a.实参可以是:常量、变量、表达式、函数等

int Add(int x,int y) { return (x+y); } int main() { int a = 0; int b = 9; Add(3,9); //实参为:常量 Add(a,b); //实参为:变量 Add(b+8,b); //实参为:表达式 Add(Add(b-2),a+1); //实参为:函数 }

b.无论实参是何种形式、何种类型,在进行函数调用时,都必须有确定的值,以便传给形参

(2)形式参数:调用函数时,函数名后括号中的变量

a.由于形式参数只有在函数被调用时才会被实例化(分配内存单元)—— 形式参数

int fun_name(int a, int b) // a,b为形式参数 { ... } int main() { ... }

b.形式参数只在函数体中有效:形参当函数调用完成后就自动就会自动销毁

4.函数的调用

(1)传值调用:函数的形参和实参分别占用不同的内存块(地址),对形参的修改不影响实参

Swap(a,b)

(2)传址调用

a.把函数外部创建的内存地址传递给函数参数的一种调用函数的方法

b.可以让函数和函数外部的变量建立联系——函数可以直接才做函数外部的变量

Swap(&a,&b)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 2:46:33

AI服务测试离线化:JevTape实现真实LLM决策录制与回放

1. 项目概述:为什么“录一次真实 AI 决策,以后测试全离线跑”这件事值得专门造个工具?JevTape 这个名字乍看像 Java Tape(磁带)的组合,但实际它指向一个非常具体、非常痛的工程实践场景:AI 服务…

作者头像 李华
网站建设 2026/10/1 2:44:18

RomM BIOS 固件配置:GBA 模拟器黑屏一次修好

RomM BIOS 固件配置:GBA 模拟器黑屏一次修好 【免费下载链接】romm A beautiful, powerful, self-hosted ROM manager and player. 项目地址: https://gitcode.com/GitHub_Trending/rom/romm RomM 刚跑起来,点开一个 GBA 游戏,画面停在…

作者头像 李华
网站建设 2026/10/1 2:43:48

运动模糊的本质与量化控制:从物理原理到工程实践

1. 运动模糊不是“糊”,而是光与时间的精确契约你有没有拍过跑步的人,结果照片里人影拉出一道虚线?有没有录过快速挥动的球拍,回放时发现球体边缘像被橡皮擦蹭过一样发毛?甚至用手机扫二维码,手一抖&#x…

作者头像 李华
网站建设 2026/10/1 2:42:35

AIRAGDebug:一键定位RAG链路异常

AIRAGDebug智能检索链路异常定位与调试分析 一、文档概述 RAG(检索增强生成)架构已成为大模型落地企业知识库、智能问答、文档解析场景的核心方案,但实际业务落地中,常出现检索失效、内容匹配不准、上下文错乱、响应幻觉等隐性问题…

作者头像 李华
网站建设 2026/10/1 2:42:19

PSVita上跑Vulkan:翻译层实现与内存管理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华