🧩 C语言回调函数笔记
一、什么是回调函数
回调函数(Callback Function) 是通过函数指针传递给另一个函数,并在适当时机被后者调用的函数。
通俗解释:
你把自己写的函数地址交给别人,别人在合适的时候“回过头”来调用它,这个过程叫“回调”。
二、回调函数的原理
- 函数名本质是函数入口地址;
- 可以用函数指针保存这个地址;
- 将函数指针作为参数传入另一个函数;
- 由该函数在运行过程中再通过指针调用它。
三、基本语法格式
// 定义回调函数类型
返回类型 (*函数指针名)(参数类型列表)// 回调函数示例
void func(void (*callback)(void));
示例:
#include <stdio.h>void sayHello() {printf("Hello, Callback!\n");
}void run(void (*cb)()) {printf("Before callback\n");cb(); // 调用回调函数printf("After callback\n");
}int main() {run(sayHello);return 0;
}
四、常见用途
| 用途 | 示例 |
|---|---|
| 提高灵活性 | 函数行为由外部传入的回调决定 |
| 实现解耦 | 模块间只通过函数指针交互 |
| 系统库函数 | 如 qsort() 使用比较函数回调 |
| 事件驱动编程 | GUI事件、信号处理、异步回调等 |
五、典型示例:qsort 的比较函数
#include <stdio.h>
#include <stdlib.h>int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int main() {int arr[] = {5, 2, 9, 1, 7};qsort(arr, 5, sizeof(int), compare); // compare为回调函数for (int i = 0; i < 5; i++)printf("%d ", arr[i]);return 0;
}
六、进阶示例:带参数的回调
#include <stdio.h>int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }void compute(int x, int y, int (*operation)(int, int)) {printf("Result: %d\n", operation(x, y));
}int main() {compute(5, 3, add);compute(5, 3, sub);return 0;
}
七、要点总结
- 回调函数的本质:函数指针的间接调用
- 使用时要保证函数签名(参数和返回类型)一致
- 常见使用场景:排序函数(qsort)、信号处理、插件机制
- 优点:灵活、解耦、扩展性强
八、面试高频问
-
什么是回调函数?
→ 一个通过函数指针传入、由其他函数在特定时机调用的函数。 -
回调函数与普通函数的区别?
→ 回调函数不是主动调用的,而是被动触发的。 -
举例标准库中使用回调的函数?
→qsort()、signal()、atexit()等。
