回调函数
回调函数是通过一个函数指针调用的函数,就是把一个函数的指针作为参数传递给另一个函数,当这个指针被调用时,我们就说这就是回调函数。
一个简单的例子就是qsort函数,它就是通过地址找到那个函数在调用
可以看到qsort函数有四个参数
第一个参数void* base是接受要排序的数组
第二个参数size_t num,是数组元素的总和
size_t是typedef把unsigned int重定义为size_t
第三个参数size_t width是数组一个元素的大小
第四个参数 int(compare)(const void elem1,const void* elem2)是一个函数指针,用来接受用户自己写的比较函数,至于__cdecl是一个函数调用约定,先不管
看比较函数的返回值,这里的返回值决定要排序的数组是升序还是降序,默认是升序
qsort的使用
int int_cmp(const void*e1,const void* e2)
{
return *(int*)e1 - *(int*)e2; //这里把数组排序成升序
}
//这里给一个整型数组
int main()
{
int arr[] = {
9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]); //计算数组元素个数
qsort(arr, sz, sizeof(arr[0]), int_cmp); //int_cmp是用户自己写的比较函数,函数名也是函数地址
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
}
这里要是想降序排序,可以把int_cmp函数里的e1和e2交换位置
void*表示可以接受任何数据类型的地址
不能直接对void*进行+-整数的操作
不能直接对void*进行解引用操作
各个数据类型的比较函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(int arr[], int sz)
{