在说明回调函数之前,有必要先说明一下指向函数的指针。一个函数在编译时被分配给一个入口地址,这个函数的入口地址就成为函数的指针。可以用一个指针变量指向该函数,然后通过该指针变量调用此函数。先通过一个例子来了解以下指向函数的指针的用法:
#include <stdio.h>
int max(int x,int y)
{
int z;
if(x>y)
z = x;
else
z= y;
return z;
}
void main()
{
int max(int,int);
int (*p)(int,int); //定义 p是一个指向函数的指针变量 ,p指向的函数有两个int型的参数且返回值也是int型
int a,b,c;
p = max; //将函数max的入口地址赋给指针变量p
scanf("%d,%d",&a,&b);
c = (*p)(a,b); //调用指针变量p指向的函数(这里是max(int,int)函数)
printf("a=%d,b=%d,max=%d",a,b,c);
}
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
下面是一个回调函数的例子:
/******************************
本程序通过回调函数实现
3 + 2 = 5
3 - 2 = 1
******************************/
#include <stdio.h>
//定义add函数
int add(int a,int b)
{
return (a+b);
}
//定义sub函数
int sub(int a,int b)
{
return (a-b);
}
//定义回调函数
int call_fun(int (*fun)(int,int),int a ,int b) //这里我的理解就是在传参数
{
return (*fun)(a,b);
//return fun(a,b); //事实证明这样写也能得出正确结果,不知道具体原因
}
int main()
{
printf("%d,%d\n",call_fun(add,3,2),call_fun(sub,3,2));
}
关于回调函数,依我肤浅的理解就是:回调函数本质还是函数,只是毋庸置疑的,只是将一个函数或者说一个函数的指针(地址)作为参数传递给另外一个函数。