回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为一个参数传递给另一个函数,
当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
回调函数不是由函数的实现方直接调用,而是在特定的事件或条件发生时
由另外一方直接调用的,用于对该事件或条件进行响应。
看的有点晕没事,举个例子:
以下是一个最原始的简单计算器代码:
#include<stdio.h>
int Add(int x, int y)
{
int z = x + y;
return (z);
}
int Sub(int x, int y)
{
int z = x - y;
return z;
}
int Mul(int x, int y)
{
int z = x * y;
return z;
}
int Dev(int x, int y)
{
int z = x / y;
return z;
}
int qyv(int x, int y)
{
int z = x % y;
return z;
}
void menu()
{
printf("************请输入要进行的运算************\n");
printf("**********1、Add 2、Sub**************\n");
printf("**********3、Mul 4、Dev***************\n");
printf("**********5、取余 ************\n");
printf("*************0、退出***********************\n");
}
int main()
{
int n = 0, x = 0, y = 0, z = 0;
menu();
scanf("%d", &n);
switch(n)
{ case 1: printf("请输入两个运算数");
scanf("%d %d", &x, &y);
printf("%d",Add(x,y));
break;
case 2: printf("请输入两个运算数");
scanf("%d %d", &x, &y);
printf("%d",Sub(x,y));
break;
case 3: printf("请输入两个运算数");
scanf("%d %d", &x, &y);
printf("%d",Mul(x,y));
break;
case 4: printf("请输入两个运算数");
scanf("%d %d", &x, &y);
printf("%d",Dev(x,y));
break;
case 5: printf("请输入两个运算数");
scanf("%d %d", &x, &y);
printf("%d",qyv(x,y));
break;
case 0: printf("感谢使用");
break;
default: printf("输入错误,请重新输入");
break;
}
}
在这行代码中switch语句里出现了多次语句的重复使用,造成了代码变长
这个时候就可以使用函数指针通过函数回调来缩减代码的长度。
如下:
#include<stdio.h>
int Add(int x, int y)
{
int z = x + y;
return (z);
}
int Sub(int x, int y)
{
int z = x - y;
return z;
}
int Mul(int x, int y)
{
int z = x * y;
return z;
}
int Dev(int x, int y)
{
int z = x / y;
return z;
}
int qyv(int x, int y)
{
int z = x % y;
return z;
}
void ret(int (*p)(int, int))
{
int x = 0, y = 0;
printf("请输入两个运算数");
scanf("%d %d", &x, &y);
printf("%d", (*p)(x,y));
}
void menu()
{
printf("************请输入要进行的运算************\n");
printf("**********1、Add 2、Sub**************\n");
printf("**********3、Mul 4、Dev***************\n");
printf("**********5、取余 ************\n");
printf("*************0、退出***********************\n");
}
int main()
{
int n = 0;
menu();
scanf("%d", &n);
switch (n)
{
case 1: ret(Add);
break;
case 2: ret(Sub);
break;
case 3: ret(Mul);
break;
case 4: ret(Dev);
break;
case 5: ret(qyv);
break;
case 0: printf("感谢使用");
break;
default: printf("输入错误,请重新输入");
break;
}
}
这里的ret就是用了函数回调
Add,Sub等就被称为回调函数。