#回调函数
什么是回调函数,在讲回调函数之前,我想先让大家了解一下函数指针变量和函数指针。
一.函数指针
函数指针就是用来存放函数地址的指针,函数指针定义如下:
#include <stdio.h>
int Add(int x,int y)
{
return x + y;
}
int main()
{
int a = 1;
int b = 2;
//~~&函数名~~ 和直接写~~函数名~~ 都是函数的地址,没有区别
int (*pf)(int ,int) = Add;//函数Add的地址赋给了pf,所以pf现在是函数指针变量
int ret = (*pf)(a,b);//对函数Add的调用,其实这个写法也想当于Add(a,b)
printf("%d\n",ret);
return 0;
}
int (pf)(int ,int) = Add; 这条语句就是对函数指针变量的定义,星号前面的int代表函数的返回类型,星号和指针变量名一定要用括号括起来,星号右边的括号用来放参数的类型的。把函数指针变量名去掉就是函数指针类型了: int ()(int ,int)。
二. 回调函数
- 回调函数就是通过一个函数指针调用的函数
就是你把函数1的指针(地址)作为参数传递给函数2,然后这个函数1的指针被用来调用其所指向的函数,这个被用来调用的函数就是回调函数,其实也就是说函数1本来不是回调函数的,但是它被函数2调用了,然后函数1就变成回调函数了,大概是这样理解的。要注意的是回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。
一段代码让你更深刻的体会一下:
#include <stdio.h>
void print_1()//print_1被函数2调用,所以是回调函数
{
printf("haha\n");
}
void print_0()//print_0被函数2调用,所以是回调函数
{
printf("hehe\n");
}
void print(void (*pf)())//print函数传过来的是函数的地址,所以形参部分用函数指针类型,这时pf指向函数1
//函数2通过函数1的指针(地址)来调用其所指向的函数
{
pf();//调用函数1
}
int main()
{
int input = 0;
printf("请输入1或0\n");
scanf("%d",& input);
if(input == 1)
{
print(input_1);//input_1相当于函数1,而print相当于函数2
}
else
{
print(input_0);//input_0相当于函数1,而print相当于函数2
}
return 0 ;
}
我想通过上面的代码,大家对回调函数也有所理解了
回调函数还可以用来写简易版的计算机(转移表)
简易版计算机源码如下:
#include <stdio.h>
int Add(int x,int y)
{
return x + y;
}
int Sub(int x,int y)
{
return x - y;
}
int Mul(int x,int y)
{
return x * y;
}
int Div(int x,int y)
{
return x / y;
}
void menu()
{
printf("============\n");
printf("1.Add 2.Sub\n");
printf("3.Mul 4.Div\n");
printf("===0.exit===\n");
}
void Calc(int (*pf)(int x,int y))
{
int x = 0;
int y = 0;
printf("请输入两个操作数\n");
scanf("%d %d",&x,&y);
int result = (*pf)(x,y);
printf("%d\n",result);
}
void test1()
{
int (*pf[5])(int,int) = {0,Add,Sub,Mul,Div};//为了提高代码的可读性,增加了0
int input = 0;
do
{
menu();
printf("请选择你要计算的序号(1~4):\n");
scanf("%d",&input);
switch(input)
{
case 1:
Calc(Add);
break;
case 2:
Calc(Sub);
break;
case 3:
Calc(Mul);
break;
case 4:
Calc(Div);
break;
case 0:
printf("退出计算机\n");
break;
default:
printf("序号错误,请重新选择\n");
break;
}
}while(input);
}
int main()
{
test1();
return 0;
}
简易版计算机就完成了,希望大家读了这篇文章有所收获,还有不明白的或者有错误的地方可随时提出,一起加油!!