C语言、嵌入式重点知识:回调函数

2022-12-18 0 793

序言

上文撷取了三个专供的单二叉树的INS13ZD实例:单二叉树的INS13ZD

这儿提及了三个关键字:专供。与专供相关联的词是通用型。他们从字面能很难认知这三个词,专供是特别针对某一情形的,特征是很有不足之处;通用型是能特别针对绝大多数情形(更平庸的是大部份情形),特征是精确性广。

为何说上篇讲义的单二叉树是专供的?

C语言、嵌入式重点知识:回调函数

从他们的表述的原素统计正则表达式就能晓得,他们那个单二叉树是而已用以储存int类别的统计数据的,这就很能充分体现出了局限性(这而已当中一点儿,总之除了其他的许多不足之处),因而是个专供的单二叉树。

他们要撰写三个通用型的单二叉树不然,他们具体来说要做的是是修正单二叉树节点内部结构体了,能修正为:

C语言、嵌入式重点知识:回调函数

假如他们要放置有理数,他们能把void*强制性转化成有理数采用。总之这篇讲义的重点项目并非撷取通用型的单二叉树。他们这篇讲义要撷取的是反弹表达式,上面步入重点项目文本:

反弹表达式法 VS 常规性法

他们上篇讲义三个列印输出二叉树统计数据的表达式:

C语言、嵌入式重点知识:回调函数

这是他们那个专供的单链附注列印二叉树统计数据表达式,他们储存的是有理数,因而用%d列印。因而,假如他们面向全国的是通用型的单二叉树呢?他们难以预见当中的统计数据,可能将是有理数,也可能将是数组,或是是其他的统计数据。因而怎么办呢?这儿有几种方法:

方法一:实现多个表达式,需要用到哪个就调哪个

C语言、嵌入式重点知识:回调函数

比如放置的是有理数,能调用dlist_print_int表达式来列印;放置的是数组,能调用dlist_print_string表达式来列印。

这种方法很简单,但有个缺点:每个表达式都很相似,会有大量重复的代码。

方法二:传入三个附加的参数来选择列印的方式

C语言、嵌入式重点知识:回调函数

这种方法采用三个参数来选择列印的方式。避免了方法一中产生大量重复的代码的问题。但是他们每当要增加新类别时,都得修正这个dlist_print表达式,对于三个通用型的单二叉树来说,这样的修正是不够好的。这儿dlist_print表达式也是通用型单二叉树的一部分,他们应该尽量少去修正它。

假如他们把三个通用型的单二叉树的基础操作比喻做一栋楼房的地基,地基一旦牢牢固固的搭好之后,他们就不要再去动它了, 应该把精力放在如何搭建房子的上层上。

方法三:反弹表达式法

上面两种方法应该是很难想到的方法。现在来撷取他们可能将想不到的方法——反弹表达式法,这也是本篇讲义要撷取的重点项目。

可能将有许多朋友没用过反弹表达式,甚至有些朋友都没听说过。这儿先简单介绍反弹表达式的一些概念(以下概念来自百度百科):

反弹表达式是三个通过表达式指针调用的表达式。假如你把表达式的指针(地址)作为参数传递给另三个表达式,当那个指针被用以调用其所指向的表达式时,他们就说这是反弹表达式。

反弹表达式并非由该表达式的实现方直接调用,而是在某一的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

科学知识点:变量指针指向的是一块统计数据,指针指向不同的变量,则取到的是不同的统计数据;表达式指针指向的是一段代码(即表达式),指针指向不同的表达式,则具有不同的行为。

回归正题,上面看如何采用反弹表达式法来实现上面的需求。

C语言、嵌入式重点知识:回调函数

具体来说,他们需要实现三个通用型的列印表达式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编程、PDP编程中用得很广泛。

1、在C编程中

在C词汇的通用型工具库stdlib.h中,有如下三个表达式原型:

void qsort(void *, size_t, size_t, int (comp*)(const void *, const void *));

这是在C通用型工具库中声明的三个快速排序算法表达式,其能用以排序int类别、float类别以及数组统计数据,能按从小到大的顺序也能按从大到小的顺序排序。其关键在于表达式指针comp指向的表达式的具体实现。

2、在PDP编程中

他们之前的讲义:【RT-Thread讲义】PIN设备中断配置中,就有用到反弹表达式。RT-Thread给他们提供了PIN设备中断反弹绑定表达式:rt_pin_attach_irq

C语言、嵌入式重点知识:回调函数
C语言、嵌入式重点知识:回调函数

这是个中断实验,产生中断会反弹他们的反弹表达式,因而能在在他们的反弹表达式里做一些产生中断后需要做的操作。比如他们在那个中断反弹里列印一串数组。每当中断来时,就会列印该数组:

C语言、嵌入式重点知识:回调函数

总结

反弹表达式是三个很重要的科学知识点,他们需要掌握。而反弹表达式又与表达式指针联系密切,他们要努力把表达式指针弄懂、用熟。在C词汇中,指针很重要,表达式指针更重要。正如前辈们常说类似这样子不然:不会C指针,就没学会C词汇;不会表达式指针,就不要称自己是C词汇高手。

在这几种方法中的分析中,其实反弹表达式更多的是充分体现出了软件分层的思想。分层思想在他们软件开发中是一种很重要的思想,简单的分层他们都会,但是怎么才能算是分层分得很好呢?那是不该动的地方不动,该动的地方才动,衔接得很好,就像上面的反弹表达式法。

对于编程的学习,关于编程词汇的学习,科学知识点就因而一点儿,很快就能学完了,但是真正灵活的、熟练应用起来真的是不难,这需要他们大量地分析、思考、练习。有时间不然他们也应该多读读一些关于软件设计思想的书籍,这也是我最近在读的一类书,学学前辈们总结出的一些精华科学知识。

以上是本次关于反弹表达式的讲义撷取,如有错误,欢迎指出。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务