C语言(十)

发布于:2025-07-28 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、函数概述

函数是面向过程编程思想的具体体现,主要作用:

  • 降低程序之间的耦合性

  • 提高代码的复用性和可维护性

一个完整的 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. 标准库函数

如:printfscanfstrlenstrcmpstrcpy

  • 系统提供,无需自定义

  • 不同编译器支持的库函数数量可能不同

2. 用户自定义函数

  • 用户根据需要自定义

  • 提高模块化和代码复用能力


八、C 语言内存的五大分区

1. 栈区(Stack)

  • 系统自动分配和释放

  • 用于存储局部变量、函数调用返回地址等

  • 遵循 FILO 原则(先进后出)

  • Linux 栈约 8MB,Windows 栈通常 <1MB

2. 堆区(Heap)

  • 需要程序员手动申请(如 malloc)和释放(如 free

  • 生命周期由程序员控制

3. 静态区(全局区)

  • 存储全局变量和静态变量

  • 生命周期贯穿整个程序执行周期

4. 字符串常量区

  • 存储由双引号括起来的字符串常量

  • 单引号(如 'A')表示字符常量,不属于此区

5. 代码区(text segment)

  • 存放程序编译生成的机器指令

  • 是只读区域,防止代码被误修改


网站公告

今日签到

点亮在社区的每一天
去签到