一、什么是函数?
函数是C语言中用于封装特定功能的基本单元。你可以把它想象成一个“黑盒子”:你不需要知道内部是如何实现的,只需要提供输入(参数),它就会返回输出(结果)。这种封装性使得代码更模块化、更易维护和复用。
函数的基本结构:
返回类型 函数名(参数列表) {
// 函数体
return 返回值;
}
- 返回类型:函数执行后返回的数据类型,如
int、void等。 - 函数名:命名应见名知意,遵循命名规范。
- 参数列表:函数接收的输入,可以是零个或多个。
- 函数体:实现功能的具体代码。
二、函数的四种常见形式
1. 有返回值,有参数
int max(int a, int b) {
return a > b ? a : b;
}
2. 无返回值,有参数
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
3. 有返回值,无参数
char* allocateMemory() {
char *p = (char*)malloc(100);
memset(p, 0, 100);
return p;
}
4. 无返回值,无参数
void printMessage() {
printf("Hello, World!\n");
}
三、形参与实参
- 形参:函数定义中的参数,如
int max(int a, int b)中的a和b。 - 实参:函数调用时传入的值,如
max(10, 20)中的10和20。
注意:
- 形参与实参的类型和数量必须一致。
- 形参是函数的局部变量,与实参内存独立。
四、局部变量与栈内存
- 局部变量:定义在函数内部或代码块
{}中的变量。 - 特点:
- 生命周期仅限于函数或代码块执行期间。
- 函数结束后,局部变量所占内存被系统回收。
- 形参也属于局部变量。
⚠️ 注意:不要返回局部变量的地址,否则会出现“悬挂指针”问题。
// 错误示例:
char* faultyFunc() {
char str[] = "Hello";
return str; // 返回局部数组地址,危险!
}
五、特殊函数类型
1. 递归函数
函数调用自身称为递归。必须有一个明确的终止条件,否则会导致栈溢出。
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
2. 静态函数
使用 static 关键字修饰的函数,只能在定义它的文件中使用,避免命名冲突。
static void internalFunction() {
printf("This is a static function.\n");
}
3. 回调函数
将函数作为参数传递,在特定时机由其他函数调用。
void callback(int a, int b, int (*op)(int, int)) {
printf("Result: %d\n", op(a, b));
}
int add(int a, int b) { return a + b; }
// 调用:
callback(10, 20, add); // 输出:30
六、常用字符串处理函数
| 函数名 | 功能 | 说明 |
|---|---|---|
strlen | 求字符串长度 | 不包括结束符 \0 |
strcpy | 字符串复制 | 不安全,可能越界 |
strncpy | 安全字符串复制 | 可指定最大复制长度 |
strcmp | 字符串比较 | 按ASCII码逐字符比较 |
strncmp | 安全字符串比较 | 可指定比较长度 |
strcat | 字符串拼接 | 不安全,可能越界 |
strncat | 安全字符串拼接 | 可指定最大拼接长度 |
strchr | 查找字符首次出现 | 返回指针或NULL |
strrchr | 查找字符最后一次出现 | 返回指针或NULL |
strstr | 查找子字符串 | 返回指针或NULL |
strtok | 分割字符串 | 会修改原字符串,线程不安全 |
七、总结
- 函数是C语言模块化的基础,提高代码复用性和可读性。
- 理解形参与实参的区别,避免误用。
- 局部变量生命周期短,不要返回其地址。
- 递归需谨慎,必须有终止条件。
- 静态函数和回调函数是高级编程中常用的技巧。
- 字符串函数使用时要特别注意内存安全和越界问题。
希望这篇博客能帮助你更好地理解和运用C语言中的函数。如有疑问,欢迎留言讨论!
2286

被折叠的 条评论
为什么被折叠?



