C语言函数学习笔记:从入门到实践
一、什么是函数?
函数是C语言中用于封装特定功能的代码块,是模块化编程的核心。通过函数可以实现:
代码复用:避免重复编写相同逻辑
逻辑清晰:将复杂程序分解为多个小模块
易于维护:修改功能时只需调整对应函数
二、函数的基本语法
- 函数定义
c
c
返回类型 函数名(参数列表) {
// 函数体
return 返回值; // void类型可省略
}
示例:
c
c
// 计算两个整数的和
int add(int a, int b) {
return a + b;
}
- 函数声明(原型)
在调用函数前需要声明(通常在头文件或文件顶部):
c
c
返回类型 函数名(参数类型列表);
示例:
c
c
int add(int, int); // 参数名可省略
- 函数调用
c
int result = add(3, 5); // 结果 = 8
三、参数传递机制
- 值传递(默认方式)
传递参数的副本,原变量不受影响
c
void swap(int x, int y) {
int temp = x;
x = y;
y = temp; // 不影响调用处的变量
}
- 指针传递(修改原变量)
传递变量地址,可直接操作内存
c
void real_swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp; // 实际交换原变量值
}
四、特殊函数类型
- 递归函数
函数调用自身,需设置终止条件
c
c
// 计算阶乘(5! = 120)
int factorial(int n) {
if(n <= 1) return 1; // 终止条件
else return n * factorial(n-1);
}
- 回调函数
通过函数指针传递函数作为参数
c
void process(int a, int b, int (*callback)(int, int)) {
printf("Result: %d\n", callback(a, b));
}
// 调用示例
c
process(10, 5, add); // 输出15
五、函数使用注意事项
避免全局变量:尽量使用参数传递数据
单一职责原则:一个函数只做一件事
参数校验:对指针参数做NULL判断
c
void print_array(int *arr, int size) {
if(arr == NULL) {
printf("Invalid pointer!");
return;
}
// ...
}
递归深度:防止栈溢出(可用迭代替代)
命名规范:使用动词+名词(如 calculate_sum)
六、常见错误
❌ 未声明直接调用函数
❌ 返回值类型与声明不一致
❌ 忘记return语句(非void函数)
❌ 修改局部变量的地址(函数退出后失效)
七、实战建议
多用静态函数:用static限制函数作用域(模块化开发)
利用宏函数:简单操作用宏实现(注意副作用)
c
#define MAX(a,b) ((a)>(b)?(a):(b))
调试技巧:在函数入口/出口添加日志
c
void critical_func() {
printf("[DEBUG] Enter function\n");
// ...核心代码...
printf("[DEBUG] Exit function\n");
}
总结:
函数是C语言的灵魂,掌握函数的使用是进阶开发的基础。理解参数传递机制、熟练使用递归和回调函数,能显著提升代码质量。建议多通过实际项目练习函数设计,例如实现:
计算器程序(函数封装运算)
文件处理器(回调处理不同文件类型)
算法模块(递归实现二叉树遍历)