C语言函数详解:参数、返回值、声明与调用

C语言函数详解:参数、返回值、声明与调用
LichermioneC语言函数详解:参数、返回值、声明与调用
1. 为什么需要函数
函数将一段具有独立功能的代码封装起来,可以降低重复、拆分复杂问题并提高可读性。
1 | 返回值类型 函数名(参数列表) |
2. 库函数
C标准库提供了大量通用函数:
| 头文件 | 常用函数 | 作用 |
|---|---|---|
<stdio.h> |
printf、scanf |
输入输出 |
<string.h> |
strlen、strcpy |
字符串处理 |
<math.h> |
sqrt、pow |
数学运算 |
<stdlib.h> |
rand、malloc |
通用工具与内存管理 |
1 |
|
使用库函数时要包含正确头文件,并了解参数、返回值和错误约定。
3. 自定义函数
1 | int max_value(int x, int y) |
int:返回值类型;max_value:函数名;x、y:形式参数;return:结束函数并返回结果。
4. 形参与实参
1 | int add(int x, int y) // x、y是形参 |
C语言默认按值传递。调用函数时会把实参的值复制给形参,修改形参不会直接修改实参。
1 | void swap_wrong(int x, int y) |
如果需要修改调用者的数据,应传入地址:
1 | void swap(int *x, int *y) |
5. return语句
return 有两个作用:结束当前函数;把结果返回给调用者。
1 | int absolute(int value) |
返回值类型是 void 的函数可以使用 return; 提前结束,但不能返回具体值。
6. 数组作为函数参数
1 | void print_array(const int arr[], int size) |
形参中的 int arr[] 本质上等价于 int *arr。因此数组长度一般需要额外传入。
7. 嵌套调用与链式访问
函数可以调用其他函数:
1 | printf("%d\n", add(2, max_value(3, 5))); |
链式访问是把一个函数的返回值直接作为另一个函数的参数。前提是返回值类型与目标参数类型匹配。
8. 声明与定义
函数在调用前需要让编译器知道其签名:
1 | // add.h |
1 | // add.c |
声明描述“函数如何使用”,定义提供“函数如何实现”。大型项目通常把声明放在 .h,实现放在 .c。
9. 易错点
- 函数声明与定义的参数或返回类型不一致;
- 非
void函数遗漏返回值; - 误以为按值传递可以修改实参;
- 在被调函数中使用
sizeof(arr)求原数组元素个数; - 头文件被重复包含而没有使用 include guard。
10. 总结
函数是C语言实现模块化的基本工具。重点不是记住语法,而是明确输入、输出、职责与边界,让每个函数只解决一个清晰的问题。