你定规则,我来执行;你写动作,我来调用。
1. 回调函数是什么?
回调函数,说白了就是:你把一个函数的地址(指针)传给另一个函数,让那个函数在合适的时机回头调用你传过去的这个函数。
关键点就两个:
- 你写的(函数)
- 别人调(在某个函数内部通过函数指针调用)
2. 先看普通调用
#include<stdio.h>intadd(inta,intb){returna+b;}intmain(){intresult=add(3,5);// 主调函数主动调用 addprintf("%d\n",result);return0;}这是“正向调用”——main主动去调用add。
3. 再看回调调用
#include<stdio.h>// 这是回调函数(你写的)intadd(inta,intb){returna+b;}// 这是通用计算函数(它接收一个函数指针,回头调用它)intcalculate(intx,inty,int(*callback)(int,int)){// 在这里“回调”你传进来的函数returncallback(x,y);}intmain(){intresult=calculate(3,5,add);// 把 add 的地址传给 calculateprintf("%d\n",result);return0;}calculate并不关心具体怎么算,它只负责在内部调用你给它的那个函数。你给什么,它就怎么算——这就是回调的威力。
4. 为什么需要回调?
- 解耦:调用者不需要知道具体实现,只需约定好参数和返回值(函数签名)。
- 灵活:同一个
calculate,你可以传入add、sub、mul……实现不同行为。 - 事件驱动:比如定时器、按键响应、网络数据到达时,系统回头调用你的处理函数。
5. 一个更生活的例子
你点外卖,告诉外卖员“到了打电话给我”。
“打电话”这个动作就是回调函数——你定义了“接到电话后怎么做”(比如下楼取餐),外卖平台在“送达”这个事件发生时,回头调用你的电话(回调)。
6. C 语言实现要点
- 用函数指针作为参数。
- 回调函数的类型必须匹配(参数个数、类型、返回值)。
- 可以配合
void*传递自定义数据(实现类似闭包的效果)。
voidregister_callback(void(*cb)(int),void*user_data){// 存储 cb 和 user_data,等事件触发时调用}7. 总结
| 概念 | 一句话解释 |
|---|---|
| 回调函数 | 你写的,但交给别人去调用的函数 |
| 函数指针 | 用来“记住”回调函数的地址 |
| 回调机制 | 把“做什么”和“什么时候做”分离 |
回调函数 = 你把“动作”打包,交给框架/库,让它们在合适的时候帮你执行。
初学只要记住:函数名就是地址,把地址传过去,别人就能回头调用你。这就是回调。
如果你觉得有帮助,欢迎点赞、收藏、评论,让更多人看到!