电脑港
白蓝主题五 · 清爽阅读
首页  > 居家实用

C语言里指针和回调函数一起用,其实挺接地气的

家里老张修路由器时顺手改了段嵌入式代码,说‘这回调函数得用指针传进去,不然主程序不知道该调谁’——听起来玄乎,其实就跟快递小哥送件留个手机号一样:你把电话(函数地址)写纸上(指针),他按这个号打过去(调用),事情就办成了。

指针不只是存地址,还能存“能干活的地址”

普通指针存的是变量地址,比如 int *p = &x;;而函数指针存的是函数入口地址,比如:

void say_hello() { printf("你好!\n"); }
void (*func_ptr)() = say_hello; // func_ptr 就是指向函数的指针
func_ptr(); // 这句就等于 say_hello();

这时候,func_ptr 就是“可执行的指针”,它不光记位置,还知道怎么跑。

回调函数?就是“你先忙,有事我喊你”

电饭煲预约煮饭,到点自动启动——它没一直盯着时钟,而是把“开始煮饭”这个动作提前告诉定时芯片,等时间一到,芯片就“回调”这个动作。代码里也一样:

void delay_call(int ms, void (*callback)()) {
sleep(ms / 1000); // 模拟延时
callback(); // 到点了,执行你给我的函数
}

void turn_on_light() { printf("灯亮了\n"); }
delay_call(3000, turn_on_light); // 3秒后自动开灯

这里 turn_on_light 就是回调函数,通过函数指针传进 delay_call,不用改底层逻辑,换盏灯、换个动作,只换指针就行。

居家小改造也能用上

老王给阳台花盆加了个土壤湿度检测模块,主控每隔5分钟读一次数据。他不想每次改判断逻辑都重烧固件,就写了这么一段:

typedef void (*alert_func)(float);

void monitor_soil(float current, float threshold, alert_func on_alert) {
if (current < threshold) {
on_alert(current); // 湿度不够?喊你来处理
}
}

void water_plant(float h) { printf("浇水!当前湿度:%.1f\n", h); }
void send_sms(float h) { printf("发短信提醒:快浇水,湿度%.1f\n", h); }

// 需要浇水时执行water_plant,想告警就换成send_sms
monitor_soil(28.5, 30.0, water_plant);

指针操作回调函数,不是程序员专属黑话,它是让设备“听你安排”的一种轻巧方式——就像遥控器换电池,换的是芯,不是整个壳。