回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
行响应。
我这里或许说的有些抽象,接下来,我可以用例子来说明。
例子
我们通过C语言的库函数qosrt函数来了解这个机制
//qsort 可以排序任意类型的数据
//void qsort(void* base, //待排序数据的起始地址
// size_t num, //待排序数据的元素个数
// size_t size, //待排序数据元素的大小(单位是字节)
// int (*cmp)(const void*, const void*) //比较2个元素大小的函数指针
// );
//
这就是内置快速排序的解释说明
具体怎么使用的,看下面的代码,你就知道了
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int cmp_int(const void* e1, const void* e2) {
return(*(int*)e1 - *(int*)e2);
}
void test1() {
int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
print(arr, sz);
}
int main() {
test1();
return 0;
}
总的来说,我们看了这个例子之后,我们来看之后,我们冒泡排序,的基本思路
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void bubble_sort(int arr[], int sz)
{
int i = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序的过程
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main() {
int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
print(arr, sz);
return 0;
}
看了之后,我们来看看,借助刚刚的思路,我们来是实现任意数组的冒泡排序,上面你们发现只能比较整数类型的数据,接下来我们列举的代码就是比较任意数据的代码。
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int cmp_int(const void* e1,const void* e2) {
return (*(int*)e1 - *(int*)e2);
}
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_sort(void *base,int sz,int width,int(*cmp)( const void* e1,const void* e2))
{//int(*cmp)(void*,void*)这就是回调函数
int i = 0;
//控制冒泡排序的躺数
for (i = 0; i < sz - 1;i++)
{
//控制冒泡排序的过程
int j = 0;
for (j = 0; j < sz - 1 - i;j++)
{
//比较方法
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
{
//交换方法
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
int main() {
int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
print(arr,sz);
return 0;
}
看了上述的代码,相信大家对cmp函数有些不理解,我这里再解释一下