回调函数是一个通过函数指针调用的函数,所以回调函数一般使用函数指针来实现,所以回调函数一般不是函数实现方调用,二十在特定的场景下,由另一方调用
下面我们就通过举例子的方法来看一下回调函数,以及使用回调函数
我们先看一个冒泡排序
这个是我们自己写的一个冒泡排序
我们C语言中也有库函数来实现排序qsort
我们在看一下qsort的简单用法
我们看一下,这个就是qsort函数的基本参数
我们可以看到qsort不需要返回值,因为他是一个排序,所以不需要进行返回,接着我们看一下qsort的参数,首先我们可以看到一个void的一个指针,还有两个无符号的两个整形变量,其中num是该数组存储多少个参数,下一个size是每个变量的大小,我们还可以看到一个返回值为int的参数卫两个void指针的一个函数指针
我们先介绍一下为什么是void,因为void的指针可以接收任何类型变量的地址,这样我们就可以接收过来,然后进行使用
我们看一下qsort的使用
因为qsort函数需要一个其他的函数,而这个函数的作用就是用来比较两个变量的大小,如果第一个变量大于第二个变量那么返回>0的数字,如果相等则返回=0,如果小于则返回<0的数字,所以我们需要写一个我们自己需要的函数来比较想要比较的变量的函数,然后再把这个函数传给qsor函数这样qsort函数就可以用来排序了,如上图所示
其中qsort函数不仅可以比较内置类型,也可以比较自定义类型我们可以看一下
我们写一个自定义类型,写一个学生的类型,其中学生类里面有两个参数,其一是名字,其二是年龄
然后我们可以调用qsort函数来进行比较,但是我们需要写一个我们想要实现的比较方法
我们可以写两个比较方法,一是用年龄大小来比较,二是用名字在比较
我们可以看一下比较结果
其中这个是用年龄来比较的
下面我们来简单实现一下qsort函数
我们可以看到我们也同样需要这些参数,而我们的比较结果是在if里面进行比较,我们调用了一个cmp的比较函数
这就是该函数的实现方法,该函数的参数为void的指针,为了可以接收到所有类型的地址,所以使用void的指针,我们可以看到,我们在自己实现的qsort函数中把里面形参的指针强制转化为char类型的指针,然后给给给该函数,让该函数进行比较,如果返回值是我们所需要的我们就可以让正在比较的两个值进行交换
这是我们的交换函数,由于我们不知道要交换多少字节,所以我们需要传过去每个变量的大小,让我们方便交换等量的字节
我们最后看一下整体的调用效果
这就是回调函数的使用,自己如何实现