对指针的一些理解(四)

本文介绍了回调函数的概念及其在代码重复问题中的应用,通过qsort函数对结构体进行排序,并模拟实现了qsort函数,展示了回调函数cmp_stu_by_age和cmp_stu_by_name的作用。同时,深入剖析了bubble函数和qsort模拟实现中涉及的指针操作,包括数组排序和强制类型转换。
摘要由CSDN通过智能技术生成

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,这就是我对指针的一些理解(四)。

拜拜了,家人们。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值