回调函数
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用所指向的函数,我们就说这是回调函数。
回调函数不是由该函数的实现方式直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
举一个别人举过的例子:约会结束后你送你女朋友回家,离别时,你肯定会说:“到家了给我发条信息,我很担心你。”对不,然后你女朋友回家以后还真给你发了条信息。小伙子,你有戏了。其实这就是一个回调的过程。你留了个参数函数(要求女朋友给你发条信息)给你女朋友,然后你女朋友回家,回家的动作是主函数。她必须先回到家以后,主函数执行完了,再执行传进去的函数,然后你就收到一条信息了。
举个例子吧:
当我们在在链表中查找一个数时,我们一般会这样写:
Node *search_list( Node *node, int const value )
{
while ( NULL != node ){
if ( node->value == value ){
break;
}
node = node->link;
}
return node;
}
这样就限制我们只能在查找的数必须是int类型,当变为其他类型时我们就无法用这个函数,但是重新写一个函数,他们重复代码又太多。那我们看看用回调函数如何办到。
回调函数查找:
int compare_int( void const *a, void const *b )
{
if ( *( int * )a == *( int * )b ){
return 0;
}
return 1;
}
Node *search_list(Node *node, void const *value, int (*compare)(void const *, void const *)) //函数指针
{
while(node != NULL){
if(compare(&node->value, value) == 0) //相等
break;
node = node->link;
}
return node;
}