1. 为什么函数是C语言的灵魂部件
第一次接触C语言时,很多新手会把注意力集中在变量、循环这些基础语法上。但真正要写出结构清晰的程序,函数才是最关键的组织单元。我在带新人时发现,那些能快速上手的开发者,往往都是最先掌握函数设计技巧的。
函数本质上是一个封装好的功能模块,就像乐高积木的标准件。比如我们要处理用户登录,可以把账号验证、密码校验、权限检查这些操作分别做成函数。这样main()函数里只需要调用login(),代码立即变得清爽。
经验之谈:函数不宜过长。我习惯让每个函数的代码控制在屏幕一屏内(约30行),超过这个长度就该考虑拆分。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 函数定义的完整解剖图
2.1 函数声明与定义的黄金搭档
先看一个典型函数模板:
c复制// 声明
int max(int a, int b);
// 定义
int max(int a, int b) {
return a > b ? a : b;
}
声明就像产品的说明书,告诉编译器这个函数需要什么参数、返回什么类型。定义则是具体的实现过程。在大型项目中,我们通常会把声明放在.h头文件,定义放在.c源文件。
2.2 参数传递的三种姿势
- 值传递:最基础的方式,函数内修改不会影响原始变量
c复制void change(int x) { x = 100; }
int main() {
int a = 10;
change(a); // a仍然是10
}
- 指针传递:可以修改原始变量
c复制void change(int *x) { *x = 100; }
int main() {
int a = 10;
change(&a); // a变成100
}
- 数组传递:本质是指针传递的语法糖
c复制void printArray(int arr[], int size) {
for(int i=0; i<size; i++)
printf("%d ", arr[i]);
}
踩坑记录:数组作为参数时会退化为指针,sizeof获取的是指针大小而非数组长度,必须额外传递size参数。
