一、函数概述
函数是面向过程编程思想的具体体现,主要作用:
-
降低程序之间的耦合性
-
提高代码的复用性和可维护性
一个完整的 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)
-
存放程序编译生成的机器指令
-
是只读区域,防止代码被误修改