从零开始理解 C 语言函数指针与回调机制
在 C 语言中,函数指针是一个强大的武器,它能让程序变得灵活、可扩展、解耦更好。
很多经典的系统库、驱动开发、策略模式、回调机制,都离不开它。
下面来全面理解它的原理、用法和优势。
1. 函数名本质上就是一个指针
例如:
int add(int a, int b) { return a + b; }
add 的值是函数所在的内存地址,所以我们可以:
int(*p)(int,int) = add;
printf("%d\n", p(10,20));
2. 函数指针的定义方式
int (*op)(int, int) = NULL;
拆解:
| 部分 | 含义 |
|---|---|
int | 返回值类型 |
(*op) | op 是一个指针 |
(int,int) | 参数类型 |
3. 用函数指针实现“回调函数”
所谓回调,就是:
把函数当成参数,传给另一个函数,在运行时决定调用哪个。
示例:动态选择加法或减法
int add(int a,int b) { return a+b; }
int sub(int a,int b) { return a-b; }
int main()
{
int (*op)(int,int) = NULL;
int a=10, b=20;
int num;
printf("1:+ 2:- 输入选择:");
scanf("%d", &num);
if(num == 1) op = add;
else op = sub;
printf("结果=%d\n", op(a,b));
}
优势:
- 运行时才决定功能
- 可扩展,不需要 if/else 重写代码
- 模块解耦
4. typedef 简化函数指针
typedef int (*PFUN)(int,int);
PFUN fun = add;
比写 int (*op)(int,int); 清晰太多。
5. 函数指针 + 冒泡排序 = 策略模式
int less(int a, int b) { return a < b; }
int greater(int a, int b) { return a > b; }
void sort(int *a, int len, PFUN cmp)
{
for(int j=len-1; j>0; j--)
for(int i=0;i<j;i++)
if(cmp(a[i], a[i+1]))
swap(&a[i], &a[i+1]);
}
这样我们可以:
sort(a, len, less); // 升序
sort(a, len, greater); // 降序
这就和 C++ STL 的仿函数、Python 的 key、Java 的 Comparator 一样。
6. 函数指针是驱动程序/回调机制的基础
例如:
- Linux 中断处理回调
- GUI 事件(按钮点击)
- 网络回调(收到数据时触发)
- 多线程回调(线程执行函数)
函数指针是 C 语言实现“多态”的方式。
总结
| 特性 | 描述 |
|---|---|
| 函数名是指针 | add 本身就是地址 |
| 函数指针定义 | int (*p)(int,int) |
| 回调作用 | 解耦、灵活、模块化 |
| typedef 简化 | typedef int (*PFUN)(int,int) |
| 常用场景 | 排序、事件驱动、系统回调 |
掌握函数指针,你的 C 语言功力就提升一个等级。
527

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



