云计算百科
云计算领域专业知识百科平台

C语言基础:函数(2)&预处理命令

一、函数传参机制

函数传参是C语言中实现模块化编程和数据传递的基础,主要包括以下三种方式:

1. 值传递

  • 机制:实参将值复制给形参,形参作为实参的副本在函数内部使用。

  • 特点:

    • 形参的改变不影响实参。

    • 适用于函数只需使用外部变量值而不修改其值的场景。

  • 示例:

    void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp; // 仅修改形参,实参不变
    }

2. 全局变量传递数据

  • 机制:通过全局变量在多个函数间共享数据。

  • 特点:

    • 变量作用域为全局,任何函数均可访问。

    • 需注意全局变量与局部变量重名时,局部变量会隐藏全局变量。

  • 应用场景:跨函数数据共享,但需谨慎使用以避免耦合度过高。

3. 数组数据传递

  • 传递方式:

  • 指定数组大小:int func(int arr[5]);

  • 不指定大小,额外传递长度参数:int func(int arr[], int len);

  • 特点:

    • 数组名作为指针传递,函数内可修改数组元素。

    • 通常需传递数组长度以避免越界。

  • 字符数组(字符串)传递类似,形式为 int func(char str[]);。


二、函数调用结构

1. 函数的嵌套调用

  • 定义:在一个函数中调用另一个函数,被调函数执行完毕后返回主调函数继续执行。

  • 特点:

    • 支持多层调用,增强代码模块化。

    • 调用栈机制保证返回位置的正确性。

2. 函数的递归调用

  • 定义:函数直接或间接调用自身。

  • 关键要求:

    • 必须设置明确的终止条件,否则会导致无限递归。

    • 每次递归应朝终止条件推进。

  • 示例:斐波那契数列

    int fib(int n) {
    if (n <= 2) return 1;
    return fib(n-1) + fib(n-2);
    }

  • 注意事项:

    • 递归层次过深可能导致栈溢出。

    • 适合问题可分解为相同子问题的情况(如分治、树遍历)。


三、预处理命令

预处理在编译前执行,主要用于代码替换和条件编译。

1. 宏定义

(1)不带参数的宏
  • 语法:#define 标识符 替换文本

  • 作用:定义常量,提高代码可读性和可维护性。

  • 示例:

    #define PI 3.1415926
    #define MAX_SIZE 100

(2)带参数的宏(宏函数)
  • 语法:#define 宏名(参数列表) 替换文本

  • 特点:

    • 纯文本替换,无类型检查。

    • 无函数调用开销,执行效率高。

    • 可能导致代码膨胀,且多次求值可能产生副作用。

  • 与函数对比:

    特性宏函数函数
    处理阶段 预处理期替换 编译后调用
    类型安全
    调试 不易调试 易于调试
    代码体积 可能增大 通常较小
  • 示例:

    #define SQUARE(x) ((x) * (x))
    #define MAX(a, b) ((a) > (b) ? (a) : (b))

2. 条件编译

  • 常用指令:#if, #ifdef, #ifndef, #elif, #else, #endif

  • 用途:

    • 区分调试与发布版本。

    • 跨平台代码适配。

    • 防止头文件重复包含。

今日练习

1. 封装一个函数实现strlen的功能。

2. 封装一个函数实现strcpy的功能。

3. 封装一个函数实现strcat的功能。

4. 封装一个函数实现strcmp的功能。

5. 封装一个函数实现字符串的倒置。

赞(0)
未经允许不得转载:网硕互联帮助中心 » C语言基础:函数(2)&预处理命令
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!