目录
0.函数指针
1.指向函数指针数组的指针
- *ppfArr 说明变量 ppfArr 是一个指针
- 指针 [4] 指向的是一个数组,有4个元素
- 每个元素类型都是int (*)(int,int) 函数指针类型
- 函数指针数组:转移表
2.回调函数
把Add函数传递给pf指针(275行),通过pf去调用所指向的Add函数(259行)。
函数的地址传递给一个指针, 在函数内部通过指针调用函数的时候被调用的函数就是回调函数。通过地址在调用函数
3. qsort 排序函数
3.1 冒泡排序
冒泡排序只能排整型数据、不能排浮点型、结构体等等
3.2 qsort 函数
qsort 函数,实现任意类型数据排序的函数
quick sort 快速排序,需要引头文件 stdlib.h
qsort函数的格式:
四个参数:
- base:目标数组的起始位置,需要给定一个指针
- num:元素的个数
- width:一个元素占多少字节,可以用 sizeof 给定
- compare :比较两个元素的函数,也就是回调函数。由于不同数据间比较方法不同,所以这里需要给定一个比较方法的函数,到时候 qsort 就会自己调用。
compare里面具体讲解:(方法实现必须和qsort参数一样)
elem1、elem2 要接收两个数据,void* 说明是两个无类型的指针
void* :无类型的指针,可以接收任何类型的指针,不需要强制类型转换,也不会报类型不兼容的警告。
- 为了满足qsort能够实现任意类型的转换
- 但是因为 void* 没有类型,所以不能解引用,系统不知道访问几个字节
- 又因为 void* 没有类型,所以++的时候或者 + - 整数的时候,不知道指针的步长,所以也不能进行 + - 整数的操作
3.2.1 qsort 实现整型排序
compare传递的方法:方法实现严格一致
- int 函数名 (const void* e1, const void*e2)
- 因为这里排序整型,所以将 e1 强制转换为整型。
- 不能写成 (int*)*e1 ,因为 void* 空类型不能解引用
3.2.2 qsort 实现浮点型排序
- 方法一样的写法,只不过最后要返回 int 整型
- 所以需要最后的结果要强制转换成 int
3.2.3 qsort 实现结构体排序
结构体排序:age
结构体排序:name
字符串排序用 strcmp