回调函数 是 一个函数。如果把 函数指针 作为一个参数传递给另外一个函数(A),A利用这个指针调用这个函数指针所指向的函数,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
举个生活例子 :
B君(回调函数),A君(调用函数)。B君去A君家买东西,发现缺货,B君留下电话(函数指针)。这个例子响应事件为:有货,A君就叫B君来。
代码案例:冒泡排序的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(char* a, char* b, int sz) // 由于传过来的并不知道是什么类型,依旧需要char* 来截断,然后根据sz来获取大小
{
char k;
for(int x = 0 ; x < sz ; ++x)//
{
k = *a;
*a = *b;
*b = k;
a++;
b++;
}
}
int com(const void* x , const void* y)//比较函数
{
return *(int*)x - *(int*)y;
}
void Bubble_sort(void* arr,int num,int sz,int(*com)(void* e1, void* e2))//sz代表数组里面单个元素的大小
{
for (int x = 0; x < num; ++x)
{
int flage = 1;
for (int y = 0; y < num - x - 1; ++y)
{
if (com((char*)arr + y * sz, (char*)arr + (y + 1) * sz)>0)//void类型的指针不可以加减,因此要强制类型转换为char*,
//为什么要用char*呢? 因为char* 只访问一个字节,如果是int类型,只需要将arr截取为char类型,然后再加上它的宽度,就可以为访问到 //后面的内容
{
flage = 0;
swap((char*)arr + y * sz, (char*)arr + (y + 1) * sz,sz);
}
}
if (flage)
{
break;
}
}
}
int main(void)
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int num = sizeof(arr) / sizeof(int);
int sz = sizeof(int);
Bubble_sort(arr , num , sz , com );
for (int x = 0; x < num ; ++x)
{
printf("%d ", arr[x]);
}
}