一、函数传参机制
函数传参是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. 封装一个函数实现字符串的倒置。








网硕互联帮助中心






评论前必须登录!
注册