一、函数概述
函数是面向过程编程思想的具体体现,主要作用:
降低程序之间的耦合性
提高代码的复用性和可维护性
一个完整的 C 程序由**一个或多个程序模块(源文件)**组成。为便于开发与调试,通常会将代码拆分为多个源文件,并组合成一个整体程序。
每个源文件是一个编译单位,即 C 编译器以“源文件”为单位进行编译。
程序从
main()
函数开始执行,调用其他函数后,执行完再返回到main()
,最终在main()
结束程序运行。
二、函数的基本结构
函数定义包括两部分:
1. 函数头(首部)
类型说明符 函数名(形式参数列表)
2. 函数体
{ 声明部分; 语句部分; }
示例
int add(int a, int b)
{
return a + b;
}
int
:函数返回类型add
:函数名(int a, int b)
:形式参数{}
:函数体
三、函数的类型与约束
返回类型:可以是除数组以外的任意类型(包括
void
)return:
如果返回类型是
void
,则不能返回值;返回值类型必须与定义一致或可隐式转换;
不写返回类型默认是
int
限制:
函数不能嵌套定义
函数之间可以互相调用,包括嵌套调用
四、函数的调用
基本语法:
函数名(实际参数);
示例:
int result = add(3, 5); // 实参传入 3 和 5
调用规则:
实参与形参数量必须一致,类型要匹配或可自动转换;
实参与形参名称可相同,但属于不同作用域;
函数必须先声明或定义,否则无法调用;
函数嵌套调用示例:
int add(int a, int b) {
return a + b;
}int square(int x) {
return x * x;
}int main() {
int result = square(add(2, 3));
printf("%d\n", result); // 输出 25
return 0;
}
五、函数调用注意事项
值传递:函数传参是值传递,传的是副本,不影响原变量;
参数计算顺序:从右向左
fun(i++, i++, i++); // 实际执行顺序为从右向左
不要在一次调用中对同一变量进行多次自增/自减,可能导致结果不可预测。
C 语言不支持函数重载,即函数不能重名。
六、return 语句说明
return
可终止当前函数并返回值(或不返回)返回值类型应与函数声明一致
七、函数的种类
1. 标准库函数
如:printf
、scanf
、strlen
、strcmp
、strcpy
等
系统提供,无需自定义
不同编译器支持的库函数数量可能不同
2. 用户自定义函数
用户根据需要自定义
提高模块化和代码复用能力
八、C 语言内存的五大分区
1. 栈区(Stack)
系统自动分配和释放
用于存储局部变量、函数调用返回地址等
遵循 FILO 原则(先进后出)
Linux 栈约 8MB,Windows 栈通常 <1MB
2. 堆区(Heap)
需要程序员手动申请(如
malloc
)和释放(如free
)生命周期由程序员控制
3. 静态区(全局区)
存储全局变量和静态变量
生命周期贯穿整个程序执行周期
4. 字符串常量区
存储由双引号括起来的字符串常量
单引号(如
'A'
)表示字符常量,不属于此区
5. 代码区(text segment)
存放程序编译生成的机器指令
是只读区域,防止代码被误修改