回调函数:如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,即调用者提供一个函数但自己不去调用它,而是让实现者去调用它,这称为回调函数(Callback Function)。
先理解一下关于指针数组的概念,定义一个指针数组,int *[3] p;这种定义只能从理解上对我们有帮组,但真正的指针数组却不能这么定义,int *p[3];
函数指针,或许我们这么定义从理解上对我们有帮助,void *(void *) func;但在编译器下要必须这么定义才会被编译器识别,void (*func)(void *);
我们来看一个例子:
#include <stdio.h>
int func(int a,int b)
{
if (a>b)
{
return a;
}
else
{
return b;
}
}
int main(int argc, char* argv[])
{
int iVar=0;
int (*fp)(int a,int b);
fp=&func;
iVar=(*fp)(4,2);
printf("funcation return value:%d\n",iVar);
return 0;
}
改程序实现了一个函数,定义一个函数指针,将实现函数的地址赋给该函数指针,
指针调用跟函数名直接调用从程序的实现上看是很类似,看到这儿可能会有这样的疑问,函数名调用跟函数指针调用一样啊,为什么要用函数指针调用,不是用函数名调用会更方便,指针调用还多了一行的代码?
程序在编译时会给变量,函数等分配内从空间,要是在程序执行时,使用函数名调用的话,程序会在内从中拷贝函数的内容在执行,而函数指针会直接到函数在编译时分配的空间执行代码,所以会在执行效率上有所提高。
回调函数:
此示例由三个文件组成:para_callback.h、para_callback.c、callback.c,三者的代码如下:
/**************************para_callback.h**************************/
#ifndef PARA_CALLBACK_H
#def PARA_CALLBACK_H
//声明一个函数指针类型callback_t,用callback_t声明的变量指向这样的函//数:无返回值,有一个参数,参数类型为空指针类型
typedef void (*callback_t)(void *);
void speak(callback_t, void*);
#endif
/**************************para_callback.c**************************/
#include"para_callback.h"
void speak(callback_t func, void*variable)//这就是下面论述中的“实现者”
{
func(variable);
}
/****************************callback.c****************************/
#include"para_callback.h"
#include<stdio.h>
void speakint(void* variable)//这就是传说中的回调函数中的一个
{
printf("%s%d","I am a integer variable: ",*((int*)variable));
}
void speakfloat(void* variable)//这就是传说中的回调函数中的一个
{
printf("%s%f","I am a float variable: ",*((float*)variable));
}
int main()//在本例中,main函数就是下面论述中的“调用者”
{
int variable_int = 100;
float variable_float = 100.9;
speak(speakint, (void*)&variable_int);
speak(speakfloat, (void*)&variable_float);
}
在本例中speakint,speakfloat为回调函数,有实现者去调用,可回调函数是有参数的,怎么进行传递那,在调用者调用实现者后,实现者去实现回调函数是会给回调函数传一个参数进去。