重庆的网站设计公司价格,知乎 做网站的公司 中企动力,wordpress 表单附件,网站上添加百度地图导航前言 上文分享了一个专用的双链表的基本操作示例#xff1a;双链表的操作示例#xff08;附代码#xff09;这里提到了一个关键词#xff1a;专用。与专用对应的词是通用。我们从字面上可以很容易理解这两个词#xff0c;专用就是针对特定情况的#xff0c;特点就是很有局… 前言 上文分享了一个专用的双链表的基本操作示例双链表的操作示例附代码这里提到了一个关键词专用。与专用对应的词是通用。我们从字面上可以很容易理解这两个词专用就是针对特定情况的特点就是很有局限性。通用就是可以针对大多数情况更理想的就是所有情况特点就是适用性广。为什么说上篇笔记的双链表是专用的从我们的定义的元素数据类型就可以知道我们这个双链表是只是用来存储int类型的数据的这就很能体现出了局限性这只是其中一点当然还有其它的很多局限性因此是个专用的双链表。我们要编写一个通用的双链表的话我们首先要做的是就是修改双链表结点结构体了可以修改为如果我们要存放整数我们可以把void*强制转换成整数使用。当然这篇笔记的重点不是分享通用的双链表。我们这篇笔记要分享的是回调函数下面进入重点内容回调函数法 VS 常规法 我们上篇笔记中有一个打印输出链表数据的函数这是我们这个专用的双链表中打印链表数据函数我们存储的是整数所以用%d打印。那么如果我们面向的是通用的双链表呢我们无法预知其中的数据可能是整数也可能是字符串或者是其它的数据。那么怎么办呢这里有几种方法方法一实现多个函数需要用到哪个就调哪个比如存放的是整数可以调用dlist_print_int函数来打印存放的是字符串可以调用dlist_print_string函数来打印。这种方法很简单但有个缺点每个函数都很相似会有大量重复的代码。方法二传入一个附加的参数来选择打印的方式这种方法使用一个参数来选择打印的方式。避免了方法一中产生大量重复的代码的问题。但是我们每当要增加新类型时都得修改这个dlist_print函数对于一个通用的双链表来说这样的修改是不够好的。这里dlist_print函数也是通用双链表的一部分我们应该尽量少去修改它。假如我们把一个通用的双链表的基础操作比喻做一栋楼房的地基地基一旦牢牢固固的搭好之后我们就不要再去动它了应该把精力放在如何搭建房子的上层上。方法三回调函数法上面两种方法应该是很容易想到的方法。现在来分享我们可能想不到的方法——回调函数法这也是本篇笔记要分享的重点。可能有很多朋友没用过回调函数甚至有些朋友都没听说过。这里先简单介绍回调函数的一些概念以下概念来自百度百科回调函数就是一个通过函数指针调用的函数。如果你把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时我们就说这是回调函数。回调函数不是由该函数的实现方直接调用而是在特定的事件或条件发生时由另外的一方调用的用于对该事件或条件进行响应。知识点变量指针指向的是一块数据指针指向不同的变量则取到的是不同的数据函数指针指向的是一段代码即函数指针指向不同的函数则具有不同的行为。回归正题下面看如何使用回调函数法来实现上面的需求。首先我们需要实现一个通用的打印函数dlist_print把函数指针变量作为其中一个参数传入。其次我们调用者得根据实际情况实现一个用于打印的回调函数这里我们实现的的回调函数是dlist_print_int。最后在用到打印的地方调用dlist_print函数即可。用回调函数法是不是很巧妙此处我们用到了typedef来“封装”一个打印链表数据的函数指针类型这可能会刷新了初学者对于typedef关键字的认识。因为我们刚开始学C语言的时候总认为typedef取别名的一般形式为typedef 旧名字 新名字;
确实也是这样但遇到给函数指针类型、数组类型等定义别名的时候就要特别区分了。如typedef char ARRAY20[20];
ARRAY20 a1,a2; /* 等价于char a1[20],a2[20]; */
别问为什么就是这样的。。。回调函数的例子 上面分析了那么多可能很多朋友会觉得回调函数太麻烦了没必要用。但是现实是回调函数在我们的C编程、嵌入式编程中用得很广泛。1、在C编程中在C语言的通用工具库stdlib.h中有如下一个函数原型void qsort(void *, size_t, size_t, int (comp*)(const void *, const void *));
这是在C通用工具库中声明的一个快速排序算法函数其可以用来排序int类型、float类型以及字符串数据。可以按从小到大的顺序也可以按从大到小的顺序排序。其关键在于函数指针comp指向的函数的具体实现。2、在嵌入式编程中我们之前的笔记【RT-Thread笔记】PIN设备中断配置中就有用到回调函数。RT-Thread给我们提供了PIN设备中断回调绑定函数rt_pin_attach_irq这是个中断实验产生中断会回调我们的回调函数所以可以在在我们的回调函数里做一些产生中断后需要做的操作。比如我们在这个中断回调里打印一串字符串。每当中断来时就会打印该字符串总结 回调函数是一个很重要的知识点我们需要掌握。而回调函数又与函数指针联系密切我们要努力把函数指针弄懂、用熟。在C语言中指针很重要函数指针更重要。正如前辈们常说类似这样子的话不会C指针就没学会C语言不会函数指针就不要称自己是C语言高手。在这几种方法中的分析中其实回调函数更多的是体现出了软件分层的思想。分层思想在我们软件开发中是一种很重要的思想简单的分层我们都会但是怎么才能算是分层分得很好呢那就是不该动的地方不动该动的地方才动衔接得很好就像上面的回调函数法。对于编程的学习关于编程语言的学习知识点就是那么多很快就能学完了但是真正灵活的、熟练应用起来真的是不容易这需要我们大量地分析、思考、练习。有时间的话我们也应该多读读一些关于软件设计思想的书籍这也是我最近在读的一类书学学前辈们总结出的一些精华知识。最后以上就是本次关于回调函数的笔记分享如有错误欢迎指出。如果觉得文章不错转发、在看也是我们继续更新得动力。 回复「 篮球的大肚子」进入技术群聊回复「1024」获取1000G学习资料