当前位置: 首页 > news >正文

回调函数的应用


1. 回调函数 — 用函数指针重构计算器

1.1 什么是回调函数

回调函数:把一个函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这个函数是回调函数。

换句话说:你不是直接调用函数,而是把函数指针传进去另一个函数,让别人在合适的时机帮你调用。

#include<stdio.h>voidprint(){printf("hehe\n");}voidtest(void(*p)())//2)接收print函数的地址{p();//3)指向的是print函数}intmain(){test(print);//1)把print函数地址传参return0;}

输出:hehe

1.2 传统写法的问题

之前我们写了一个简单的计算器,用switch-case调用对应的加减乘除函数:

// 运算函数intadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}intdiv(inta,intb){returna/b;}intmain(){intx,y;intinput=1;intret=0;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d",&input);switch(input){case1:printf("请输入两个操作数:");scanf("%d %d",&x,&y);ret=add(x,y);printf("ret = %d\n",ret);break;case2:printf("请输入两个操作数:");scanf("%d %d",&x,&y);ret=sub(x,y);printf("ret = %d\n",ret);break;case3:printf("请输入两个操作数:");scanf("%d %d",&x,&y);ret=mul(x,y);printf("ret = %d\n",ret);break;case4:printf("请输入两个操作数:");scanf("%d %d",&x,&y);ret=div(x,y);printf("ret = %d\n",ret);break;case0:printf("退出程序\n");break;default:printf("输入错误\n");break;}}while(input);return0;}

痛点:每个case分支里的操作几乎一模一样(提示输入 → 读取操作数 → 调用函数 → 打印结果),大量冗余代码。

1.3 回调函数改造 — 抽离公共逻辑

把"提示输入 + 调用函数 + 输出结果"这个通用流程抽成一个calc函数:

#include<stdio.h>intadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}intdiv(inta,intb){returna/b;}// 回调函数的核心:用函数指针作为参数//calc函数相当于一个中转站,我只需要给他一个函数地址,就能在calc函数调用这个函数,避免重复代码voidcalc(int(*pf)(int,int))//假设接收add函数地址{intret=0;intx,y;printf("请输入两个操作数:");scanf("%d %d",&x,&y);ret=pf(x,y);//pf指的是add函数,完成加法printf("ret = %d\n",ret);}intmain(){intinput=1;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d",&input);switch(input){case1:calc(add);// 把 add 传进去 → add 就是回调函数break;case2:calc(sub);// sub 是回调函数break;case3:calc(mul);// mul 是回调函数break;case4:calc(div);// div 是回调函数break;case0:printf("退出程序\n");break;default:printf("输入错误\n");break;}}while(input);return0;}

对比总结

维度传统写法回调函数写法
重复代码每个 case 都写一遍"提示→输入→调用→输出"公共逻辑抽离到calc
可维护性改输出格式要改 4 处只需改calc一处
核心思想直接调用把函数当参数传

核心理解calc接收一个int(*pf)(int, int)类型的函数指针,通过pf(x, y)来回调。这样add/sub/mul/div都成了回调函数。


http://www.jsqmd.com/news/1190101/

相关文章:

  • 2026 年更新:丹东口碑好的首饰回收店怎么联系,别再扔了!这批古董珠宝的惊人变现价值曝光 - 企业推荐管【认证】
  • FreeRtos的基础与应用
  • 面试官:什么是Zookeeper的选举机制?
  • 硬盘文件系统系列专题之二:NTFS的元数据王国与数据寻踪
  • 国内清水砼(仿清水混凝土)厂家实力排行及实测对比 - 互联网科技品牌测评
  • 《Java 100 天进阶之路》并发编程与JUC通关总结:从线程基础到并发容器,一套吃透Java高并发全链路(2026版)
  • 慧净电子HL-1+HL-2小车ATmega16A寄存器库学习AVR-GCC开源工具链VS Code学习记录(第一坑)
  • C++17实战:用std::optional与std::variant构建类型安全的JSON解析器
  • C语言实现Windows调试器与全局钩子:从原理到实战
  • Haply Inverse3 力反馈设备
  • AI赋能独立游戏开发:构建3D美术全流程敏捷生产管线
  • 常州武进区湖塘镇亨得利官方钟表服务中心电话公示(2026年7月最新) - 亨得利官方博客
  • 福建福州泉州厦门起名老师水平深度测评根据本地网友真实口碑排名 - 优企甄选
  • 《Java 100 天进阶之路》并发编程与JUC详解(第51~60篇)核心知识点汇总
  • 西峰黄金回收实测大盘点!塬区居民变现避坑,3 家持证门店全维度对比 - 福金阁黄金回收
  • 2026新手抖店无货源完整实操攻略!1688一件代发合规稳做,零囤货少踩坑 - 抖掌柜
  • MATROX Y7583-00 接口模块
  • 2026 抖店新手软件选型:官方工具与 ERP 性价比及免费付费对比 - 抖大侠
  • AI伦理审计:软件测试中的公平性度量与实践
  • 浙大提出即插即用AI绘图加速方案:Stable Diffusion生成速度提升5倍
  • 湖州全屋定制哪家专业
  • 遗传算法工业级调参与可解释性实践指南
  • 2026年7月最新无锡卡地亚官方售后客服服务电话及地址网点大全 - 卡地亚服务中心
  • 全年市场调研:2026压力传感器十大品牌盘点,广东犸力覆盖中小型设备需求 - 品牌速递
  • 抖店新手避坑指南:商品上架AI违规检测完整教程,抖掌柜一站式搞定合规铺货 - 电商分享
  • 2026年度五大GEO优化公司实力测评:企业服务商选型全维度参考 - GEO优化
  • 5分钟终极指南:如何使用wechat-need-web解锁微信网页版访问限制
  • 支持百万级TPS,Kafka是怎么做到的?
  • Windows系统深度清理指南:从临时文件到专业工具全面解析
  • 2026 抖店新手最值得买的软件是什么?ERP 与运营工具免费付费推荐 - 抖大侠