C 语言函数指针进阶
更新时间:2026-08-26。本文是
languages/c/主题高手层的骨架文档(占位),完整展开将在后续批次补齐。
本文要回答的问题
- 函数指针的类型为什么那么绕?怎么声明才不晕?
- 回调是什么?
qsort为什么需要传一个函数指针? - 函数指针数组怎么当"跳转表"用?
一、回调机制
函数指针让"调用方"和"被调用的行为"解耦:库定义流程、调用方注入行为。
c
int cmp(const void *a, const void *b); /* 比较回调 */
qsort(arr, n, sizeof(int), cmp); /* 库负责排序,cmp 决定次序 */| 应用 | 例子 |
|---|---|
| 排序/查找 | qsort、bsearch 的比较函数 |
| 事件回调 | 信号处理、GUI/网络库的 handler |
| 遍历访问者 | 对容器每个元素执行自定义操作 |
二、类型与 typedef
c
typedef int (*CmpFn)(const void *, const void *);用 typedef 把"函数指针类型"起个名,声明和传参都清爽。函数指针数组再进一步:
c
int (*handlers[])(int) = { f1, f2, f3 }; /* 跳转表 */按下标调用 handlers[i](x),比一长串 if/else 更清晰,也更容易扩展。
三、高级用途
- 状态机:状态转移表用"状态 × 事件 → 处理函数指针"实现,见 状态机实践。
- 策略模式:同一算法不同实现,运行时切换(排序策略、压缩策略)。
- 分层架构:接口用函数指针表模拟"虚函数",C 也能写出面向对象的分层。
四、与入门层的衔接
一句话总结
函数指针把"行为"变成"值":回调解耦流程与实现,跳转表把 if/else 变成下标查表,typedef 把绕口的声明变清爽——C 的运行时多态就靠它。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。