一、回调函数
把一个函数 A,当作参数传给另一个函数 B,让 B 在合适时机自动调用 A,A 就叫回调函数。



二、qsort使用举例
在之前,我们学过冒泡排序,但是只能处理整型数组的排序,如下图

qsort 函数可以排序任意类型的数据,下面我们来学习一下qsort 函数:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
1.参数
1.void *base:数组首地址(通用空指针,可以接收任意类型数组)
2.size_t nitems:数组元素个数
3.size_t size:单个元素的字节大小,一般写sizeof(arr[0])
4.int (*compar)(const void *, const void *):函数指针,接收回调函数
2.回调比较函数规则
int compar(const void *a, const void *b)
{
//a、b是待比较两个元素的地址
}
返回值规则:
返回 负数:a 排在 b 的前面(a < b)
返回 正数:b 排在 a 的前面(a > b)
返回 0:a 和 b 相等,顺序不关心
int 数组速记:
升序:return *(int*)a - *(int*)b;
降序:return *(int*)b - *(int*)a;
原理:void*是空指针,不能直接解引用,必须强制转换成对应类型指针再取值。
ex:
整型:

float :

struct:
(按年龄排序)

(按名字排序)

补充:
1.两个字符串比较大小的方法:strcmp
strcmp(str1,str2)
str1 > str2 返回 >0
str1 = str2 返回 0
str1 < str2 返回 <0
2.-> 结构体成员访问操作符
结构体指针 -> 成员名

结构体变量.成员名

这两种的作用是一样的
tip: (*p).age 的括号不能丢 !*p.age 是错的,. 优先级比 * 更高
三、qsort 函数的模拟实现


