C语言系列
C语言系列_9:函数指针,函数指针数组和回调函数
(5)函数指针
A:什么是函数指针
数组指针是指向数组的,函数指针就是指向函数的,也就是函数也是有自己的地址的
这里要注意一点,数组的时候&数组名是数组的地址,数组名是数组首元素的地址。
而函数名和&函数名都是函数的地址(下图传错了)
B:函数指针及其使用
函数指针的定义和数组指针基本类似
(6)函数指针数组
A:什么是函数指针数组
函数指针数组,本质是指针数组,也就是它是存放函数指针的一个数组。
B:函数指针数组
如下,有2个函数,分别表示加减乘除,他们的函数返回类型和参数类型是一致的,所以可以用一个数组保存他们的地址
C:函数指针数组的用途
函数指针数组能够很好地保存一组具有相同参数类型,相同返回值的函数的地址。它的一个经典例子就是“转移表”。比如在计算器例子中,使用switch case语句,如果使用普通方式,要增加一些其他运算时,其case语句要多次增加,显得很臃肿,而运用函数指针数组,则能避免这种情况,且在后期增加新的相同类型的运算时,在主函数内只需增加新函数地址
(7)指向函数指针数组的指针
我们说过,函数指针数组它是一个数组,数组中每个元素是函数指针。通过前面的学习我们知道指向数组的指针叫做数组指针,以此类推,既然函数指针数组是一个数组,那么指向它的指着就叫做指向函数指针数组的指针
(8)回调函数
A:引言
回调函数就是把一个函数的地址进行传参,最后通过地址来调用函数,一下是一个经典例子
前面的时候,咱们讲过冒泡排序,可以使一组整形数据排序
但是这个函数不够通用,因为在面对浮点型,结构体这种特殊数据时,就不能排序了
B:void指针
前面说过对于int数据,应该定义int*的指针,依次类推,但是不知道这个指针的类型具体是什么的时候,可以将其定义为void类型,也就是空类型
所以void指针的特点就在于此,后续讲解中也是运用到了void指针的这样一个特点。但是特别需要注意的一点是,指针类型的意义在于在进行指针移动时其具体需要移动几个字节的问题,而对于void指针不知道定义的是什么类型,所以不能进行解引用操作。
C:qsort函数
qsort函数就是快速排序,可以帮助我们解决上述的问题,比如下方int数组比较
此时,他就可以完成float数组的排序
当然他也可以完成结构体的比较
D:qsort函数(冒泡排序法模拟实现)
上一节我们讲了,qsort函数,qsort函数第四个参数需要我们自己传入一个比较函数,这个比较函数的返回值是一个大于0,或者小于0或等于0的数,qsor函数通过这样的一个参数完成具体的排序,交换的过程,其具体的方式是快速排序。但是这里通过冒泡排序,来推究到底这个qsort函数内部是如何实现的