回调函数究竟有什么作用呢
设想现在有一个库函数叫bubble_sort 可以使用冒泡排序算法,但是用户有时候想调用它对整形数组排序,有时又想对字符数组进行排序,那怎么设计这个库函数呢?
解决方法就是在库函数中留一个参数是函数指针,指向回调函数,而这个回调函数由用户编写,根据自己的需求写出具体的类型比较规则。
这样用户不需要知道库函数具体的实现,只需要传入一个比较函数就可以得到答案。
回调函数的精髓
回调函数就是一个通过函数指针传入另一个函数并当作另一个函数参数 的函数,在特定的时候被调用(而不是在传参的时候)。
#include <stdio.h>
//用户自己写的cmp函数,也即回调函数
int cmp_int(const void *a, const void *b)
{
return (*(int*)a > *(int*)b);
}
//通用的逐字节内存交换函数
void swap(void *pa, void *pb, int length)
{
char *p1 = pa;
char *p2 = pb;
while (length--) {
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
p1++;
p2++;
}
}
//可以实现任意类型排序的库函数
void bubble_sort(void *arr, int size, int length, int(*cmp)(void *, void *))
{
int i = 0;
int j = 0;
for (i = 0; i < size - 1; i++) {
int flag = 1;
for (j = 0; j < size - 1 - i; j++) {
//由于具体比较的两个参数无法比较,所以设计一个回调函数
//由用户传入确定的比较规则
if (cmp((char*)arr+j*length, (char*)arr+(j+1)*length)>0) {
swap((char*)arr + j * length, (char*)arr + (j + 1)*length, length);
flag = 0;
}
}
if (flag) {
return;
}
}
}
int main()
{
int arr[10] = { 5,8,7,9,4,3,6,1,2,0 };
int size = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, size, sizeof(int), cmp_int);
}