1、回调函数
今天要了解的是回调函数是什么
回调函数就是一个通过函数指针调用的函数
这里我们先来了解一下概念:
如果你把函数的地址作为一个参数传递给另外一个函数,当这个指针被用来调用其指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是再特定的事件或条件发生时由另外的一方面调用,用于对该事件或条件的响应。
要想理解,我们先来看段转移表代码
这是最初始的转移表,该表看这不难,但是代码太多重复的,所以我们要想办法去解决这种代码重复的问题,这时候就要用到回调函数去减少代码段了。
这就是经过回调函数而减少了一些代码段,可以看出这里普通的就是直接调用,而回调函数则是通过获取函数地址,然后去进行用函数指针的办法来求出结果。
这里可以减少一些代码段
2、qsort函数使用
这里面我们通过去看段代码来理解qsort函数的使用情况,这么我们选择了通过用qsort来对结构体去进行排序,通过对结构体的排序可以更加方便我们了解qsort函数的使用。
这里是qsort函数的使用过程,使用qsort时,我们需要包含头文件stdlib.h,然后qsort函数是用来进行排序时才来使用的,接下来我们就来看看输出结果是什么吧。
可以看到,经过排序之后,它们的名字以及年龄都进行了排序,从小到大排序,可以看到,其实我们这里也用到了上面我们所讲的回调函数,也就是cmp_stu_by_age,cmp_stu_by_name,这两个函数。
3、qsort的模拟实现
这个qsort函数不写不知道哇,可以说的是,这个函数不仅写起来费劲,而且理解起来,那也是相当困难的,首先我们先定义了一个数组,通过用bubble函数去模拟实现qsort函数,然后当我们进入bubble函数的时候,里面由用到了两个小函数,_swap和int_cmp函数,这两个函数要理解其实也还好,更多的是我们要了解bubble的函数里面为什么需要用到那些参数,如base指针是用来存储数组的地址,count是数组的个数,size是数组元素的大小,而int_cmp则就是我们所用到的回调函数了,接下来我们就要通过bubble函数里面的循环了,首先,对于判断大小我们用到了cmp函数去进行比大小如何再返回一个值,当返回的一个值大于零时,这时候我们就要进行数组元素的交换了,这里我们又要用到一个交换函数_swap函数,接下来就到了我认为最困难的一个点了,就是进入swap函数,swap函数里面,我们通常只需要对两个数交换一次就可以了,可这swap函数却用了for循环,并且循环了int类型大小的次数,也就是循环了四次,明明交换两个数只需要一次,可这却进行了四次,可当我们仔细观察时,可以发现这里的base地址类型强制转换为char*的类型了,并且传给了p1和p2,并将p1和p2的类型都强制转换成了char*类型,但我们知道,数组里面的元素是int型的,它是四个字节,而char类型是1个字节,当它们要交换地址,自然char类型的地址要交换四次,也就是循环所需要的int类型大小的次数,当将这两个数交换完成时,这里面的qsort函数的模拟实现就是成功了,这就是我们qsort函数的模拟实现,我们可以看下结果。
ok了,家人们,这就是我们经过排序之后的结果,这个qsort函数,虽然但,但我们仍然好好理解。
ok,这就是我对指针的一些理解(四)。
拜拜了,家人们。