版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
回调函数法VS常规法我们上篇笔记中有一个打印输出链表数据的函数:f ¥*¥*棒V—*甲•事.盲*M孚率导**.**季■/KWM Xf**用..Hw¥**.胃*菱审..¥"¥—¥"*号冲布.*拳¥>¥4|*丫8¥¥**耳赋•字—V乂■**•**,审'*函数:dH5tjprlnt_lrit,打■印谕出健衰”磐数:dK战:双镯表■■晅目:void隹宣*宣长扯*,应河土***质强**.Jc置xjt hJI7tK*4i*ife**PXiklLJtJtJt4*一*/•**Ji宣kJ*岗宣代***宣•t.AxSki4Jtx**1)宣ifc*.1xKMHJtJtft+*kK*.JiJtxt*4e*.*£Scystaticvoidd1ist_ppint_int(DListNode*dHist)DListllade"temp=dlist;while(temp)printf("Sd■J,temp->data);temp-temp->next;printf(“打如勺£这是我们这个专用的双链表中打印链表数据函数,我们存储的是整数,所以用%d打印。那么,如果我们面向的是通用的双链表呢?我们无法预知其中的数据,可能是整数,也可能是字符串,或者是其它的数据。那么怎么办呢?这里有几种方法:方法一:实现多个函数,需要用到哪个就调哪个尸打印龄t .staiLicvoid|dL姑匚crimi: 口1_弱1:尬如*dlistJDList?-aode■-temp■dlist;;vhile(tenp)printf("j£dtemptemp->next;澳jftf广打印字符思T,staLic\'oici|dLi$tc「ioi§tr[口Li冬ode^dli5t)DLletMode■temp■dlist;while(Lfinp)temp=ternp->next;prdntfdrAfT);比如存放的是整数,可以调用dlist_print_int函数来打印;存放的是字符串,可以调用dlist_print_string函数来打印。这种方法很简单,但有个缺点:每个函数都很相似,会有大量重复的代码。方法二:传入一个附加的参数来选择打印的方式^definePKirJT_INT1 /*打印选择;整数打印方式 */ttde-FinePKINT_STR2 /+打印选择:字符串打印方式*/staticvoiddlist_pr-int(DLis-tr-k<le intprint_匚h^ice)DListMode-*temp=dlistjwhila(&mp)\ /*打印整数Vif(PRINT_INT==print_cho^ce)print-F("jtemp-xl-ata);人打印字符串V2Is&if(PRIhJT_5TR==pnirit_choice)|printf("5icS"jtemp->data);else{}temp=temp->next;| printf(""Vn\n");这种方法使用一个参数来选择打印的方式。避免了方法一中产生大量重复的代码的问题。但是我们每当要增加新类型时,都得修改这个dlist_print函数,对于一个通用的双链表来说,这样的修改是不够好的。这里dlist_print函数也是通用双链表的一部分,我们应该尽量少去修改它。假如我们把一个通用的双链表的基础操作比喻做一栋楼房的地基,地基一旦牢牢固固的搭好之后,我们就不要再去动它了,应该把精力放在如何搭建房子的上层上。方法三:回调函数法上面两种方法应该是很容易想到的方法。现在来分享我们可能想不到的方法——回调函数法,这也是本篇笔记要分享的重点。可能有很多朋友没用过回调函数,甚至有些朋友都没听说过。这里先简单介绍回调函数的一些概念:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。知识点:变量指针指向的是一块数据,指针指向不同的变量,则取到的是不同的数据;函数指针指向的是一段代码(即函数),指针指向不同的函数,则具有不同的行为。回归正题,下面看如何使用回调函数法来实现上面的需求。数据打印座I数指针Vtypede-fvoid(■"DLietDataPrintFunc)(void7*通用的打■印也数〈房子的地是,车粒易灌)*/staticvoiddli5t_print(DListNMle DListCataPrlntFuncprint)DLlstNode"temp=dlist;Ii-jhile(temp)l>rlte呼-xtata);temp・temp->next;prjntF("\n\n")j/*这是一个回调函教:打印整数(:调用者提供,调用者根据实玄需要羽俱这杆一个打印函数>*/staticvelddliit_(voidMdata)'pr'lntff(TCd".(Uitjdata);/*主屋期I7intMaln(v41d)printfC^i]建一^双睫表:”);[dli"叩比HdMst,|注册/使用[H]调函数return0;首先,我们需要实现一个通用的打印函数dlist_print,把函数指针变量作为其中一个参数传入。其次,我们调用者得根据实际情况实现一个用于打印的回调函数,这里我们实现的的回调函数是dlist_print_int。最后,在用到打印的地方调用dlist_print函数即可。用回调函数法是不是很巧妙?此处,我们用到了typedef来“封装”一个打印链表数据的函数指针类型,这可能会刷新了初学者对于typedef关键字的认识。因为我们刚开始学C语言的时候,总认为typedef取别名的一般形式为:typedef旧名字新名字;确实也是这样,但遇到给函数指针类型、数组类型等定义别名的时候就要特别区分了。如:
typedefcharARRAY20[20];ARRAY20a1,a2;〃等价于chara1[20],a2[20];*/回调函数的例子上面分析了那么多,可能很多朋友会觉得回调函数太麻烦了,没必要用。但是现实是,回调函数在我们的C编程、嵌入式编程中用得很广泛。1、 在C编程中在C语言的通用工具库stdlib.h中,有如下一个函数原型:voidqsort(void*,size_t,size_t,int(comp*)(constvoid*,constvoid*));这是在C通用工具库中声明的一个快速排序算法函数,其可以用来排序int类型、float类型以及字符串数据。可以按从小到大的顺序也可以按从大到小的顺序排序。其关键在于函数指针comp指向的函数的具体实现。2、 在嵌入式编程中RT-Thread给我们提供了PIN设备中断回调绑定函数:rt_pin_attach_irq*definePCN#defincPINIRQ.TODE.RISINGIRQ_ra-DE_FALLIN'5IRQ^M&DE^RISINGJALLTWG&x«2IRQ_KME_HI<5H_LEV€L0x«3PTWinc*definePCN#defincPINIRQ.TODE.RISINGIRQ_ra-DE_FALLIN'5IRQ^M&DE^RISINGJALLTWG&x«2IRQ_KME_HI<5H_LEV€L0x«3PTWincPCMfldefinePINRT_EOK:0:定g某至Ph莎足云或L中断就辙— staticuoldhdr^ollback(voidchar*str=■args;rtkpr-inzi("iKE¥&pres&ed.盂叭成事str);尸打q蝴呈人口酬 〃staticvoidirqthreadentry(void*parameter)1 /*配墨KEV通期为上性瞒入V■■L_pl_-ude(PLfi_KEY&,PI'l_FIODE_II;PtJT_PLlLLL}P);/*等睡中断回调舞J,下路沿模式,回触数蛰甄为字符串“一曾邛可神知,rrt_pLn_attach_iri;(pin_KEjPIN_IRQjK®f_FALLlNC,hdjwFlM夜,〔vMU。"-ByLtiengNisn"?;尸使袍引脚甲断、-t_pi-:rq-lp(PIh_KEV6JPIN_5RQ_£NAfiLE);
这是个中断实验,产生中断会回调我们的回调函数,所以可以在在我们的回调函数里做一些产生中断后需要做的操作。比如我们在这个中断回调里打印一串字符串。每当中断来时,就会打印该字符串:^rial-COM^-文特(Fl携瑁Ei查看-¥;迭咬(QI停力⑴料本圄Z^-fLl督助加-A.fiafeJ 称瘗msh>msti>msh->\I1 J-rt-Threadoperatingsyst^rr\ 4.-Q.0EtldNov12201920{J6-copyrighibyrt-tlireadip命市nss-h>li5t_devi<edevice type refcountu^rtlcharacterDeviceZpirtWisedlineous-OevHce0insh.'KEYOpressed.kc.vOpressed,—ByKEYOpressedt*Bykevopressed.--ByKEYDpressed.--BykeyOpressed.--By心'0 —fiyKEYOpressed.-Bykey<)pressedT—ByKE.Y0pressed.-■Byk仕y。pressed.-一白yiceVOpre^^sd.--ByKEYOpressed.--ByKErOpressed.—ByKEVOpres^td.-By心。pressed,—ByKE.VOpressedL--ByKErQpressed.—ByKC.YOpressed.--BykeyOpressed.--By心。pressed,—byKEVOpressed.-BykLyOpressedr—BykevO . --Bykeyopressed,—ByKGVOpggwM.—EyKE.YQpressedt--By心。pressed,一ByK£:yf)pressedL--Bykeyopressedr—ByI--ByZhengNianJhengMariI--ByZhengNianJhengMarizh:engNianZ^hengNianEhEngFdar^h:engNlanzh-engNianrh-en^rjianEhQngNi"NKengklan^hengNianZhengNdanrtiengNlanzlrengNianMhmgtdanrh-en^1anZhengNlmizhengNianrhenG^l^iZhengNianfhenqrjlanzh^ngNianr仆四因&^hengNianmheFgrJanZhenQpjIarizhenglMianrht?n^1an回调函数是一个很重要的知识点,我们需要掌握。而回调函数又与函数指针联系密切,我们要努力把函数指针弄懂、用熟。在C语言中,指针很重要,函数指针更重要。正如前辈们常说类似这样子的话:不会C指针,就没学会C语言;不会函数指针,就
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-天津-天津土建施工人员一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-四川-四川计量检定工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-四川-四川机械热加工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-吉林-吉林兽医防治员四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-北京-北京管道工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-北京-北京工程测量员五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-北京-北京保健按摩师二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-内蒙古-内蒙古水文勘测工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-内蒙古-内蒙古堤灌维护工一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-云南-云南食品检验工一级(高级技师)历年参考题库含答案详解
- 武汉市2027届高中毕业生九月调研考试地理试卷(含答案)
- 华为光芯片机考题库(完整版含答案解析)
- 2026考研全国统考英语二冲刺试卷(详细解析)
- 四川省水利工程设计概(估)算编制规定2025
- 园林植物病虫害防治技术全套课件
- 第3课 寻找可靠数据源 课件+视频 2025-2026学年四年级全一册信息技术人教版
- 项目部对分包考核制度
- AI辅助PBL教学在内科规培中的实践
- 2026年中国火锅调味料行业市场规模、市场供需现状及促进市场需求的主要因素分析
- 1.2地球的公转课件-高中地理湘教版选择性必修1
- 麻醉科重点专科建设工作汇报
评论
0/150
提交评论