C语言的回调函数理解

回调函数是一个通过函数指针调用的函数,所以回调函数一般使用函数指针来实现,所以回调函数一般不是函数实现方调用,二十在特定的场景下,由另一方调用

下面我们就通过举例子的方法来看一下回调函数,以及使用回调函数

我们先看一个冒泡排序

de4ee45d1bbb4631a81d2e399532541d.png

这个是我们自己写的一个冒泡排序

我们C语言中也有库函数来实现排序qsort

我们在看一下qsort的简单用法

a06a9b6bc1bb435c834bd0cb37f668a4.png 

我们看一下,这个就是qsort函数的基本参数

我们可以看到qsort不需要返回值,因为他是一个排序,所以不需要进行返回,接着我们看一下qsort的参数,首先我们可以看到一个void的一个指针,还有两个无符号的两个整形变量,其中num是该数组存储多少个参数,下一个size是每个变量的大小,我们还可以看到一个返回值为int的参数卫两个void指针的一个函数指针

ee36f0cb8a7740ad9f33b699a1e2be65.png 

我们先介绍一下为什么是void,因为void的指针可以接收任何类型变量的地址,这样我们就可以接收过来,然后进行使用

我们看一下qsort的使用

122459881fa448c09da772d56f7d3021.png 

因为qsort函数需要一个其他的函数,而这个函数的作用就是用来比较两个变量的大小,如果第一个变量大于第二个变量那么返回>0的数字,如果相等则返回=0,如果小于则返回<0的数字,所以我们需要写一个我们自己需要的函数来比较想要比较的变量的函数,然后再把这个函数传给qsor函数这样qsort函数就可以用来排序了,如上图所示

 其中qsort函数不仅可以比较内置类型,也可以比较自定义类型我们可以看一下

d943502d0c3541f7aa1113b83a8306f7.png

我们写一个自定义类型,写一个学生的类型,其中学生类里面有两个参数,其一是名字,其二是年龄

然后我们可以调用qsort函数来进行比较,但是我们需要写一个我们想要实现的比较方法

92c0a82e573f4b738d15a8a693e38f95.png 

我们可以写两个比较方法,一是用年龄大小来比较,二是用名字在比较

我们可以看一下比较结果

4c0a89b3d3d54fb4a6f99ae4b944ab33.png 

其中这个是用年龄来比较的

 

 

 

下面我们来简单实现一下qsort函数

4b0cbc00dbe0426e8d9c9a2e72deb5b8.png

我们可以看到我们也同样需要这些参数,而我们的比较结果是在if里面进行比较,我们调用了一个cmp的比较函数 

1ecc462292f94c6dbae06165809800ab.png

这就是该函数的实现方法,该函数的参数为void的指针,为了可以接收到所有类型的地址,所以使用void的指针,我们可以看到,我们在自己实现的qsort函数中把里面形参的指针强制转化为char类型的指针,然后给给给该函数,让该函数进行比较,如果返回值是我们所需要的我们就可以让正在比较的两个值进行交换

1399f003abde4a8a840dcd2f89f4fb13.png 

这是我们的交换函数,由于我们不知道要交换多少字节,所以我们需要传过去每个变量的大小,让我们方便交换等量的字节

bd514807fdd740ebb2fb545d08242bd8.png 

我们最后看一下整体的调用效果

这就是回调函数的使用,自己如何实现

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值