浏览知乎看到有人问如何理解回调函数阅读了部分回答,结合维基百科的例子总结如下。
知乎上赞同数最多的回答者的答案是:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。
正常情况下比如简单的函数:int max(int a, int b);
要使用这函数,得到两者最大的值, 外面就要传进来 a, b。这个很好理解。
void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
而这个函数用于排序,最后一个参数就是回调函数,关于qsort函数的应用参考LeetCode C实现349. Intersection of Two Arrays
下面是几个常见的例子:
#include <stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
/* p 是函数指针 */
int (* p)(int, int) = &max; // &可以省略
int a, b, c, d;
printf("please input 3 numbers:");
scanf("%d %d %d", &a, &b, &c);
/* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("the maxumum number is: %d\n", d);
return 0;
}
这个例子和qsort几乎一模一样。
#include <stdio.h>
#include <stdlib.h>
struct object
{
int data;
};
int object_compare(struct object * a,struct object * z)
{
return a->data < z->data ? 1 : 0;
}
struct object *maximum(struct object * begin,struct object * end,int (* compare)(struct object *, struct object *))
{
struct object * result = begin;
while(begin != end)
{
if(compare(result, begin))
{
result = begin;
}
++ begin;
}
return result;
}
int main(void)
{
struct object data[8] = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}};
struct object * max;
max = maximum(data + 0, data + 8, & object_compare);
return 0;
}