目录
一、什么是回调函数❓❓
二、回调函数应用演示 ❗❗
回调函数:通过函数指针调用的函数,就是将一个函数的指针(地址)作为参数,当函数指针调用其所指向的函数时,这就叫回调函数。
注意:回调函数不是由该函数的实现方直接调用,而是在特定条件下,由另外一方进行调用,用于对该条件的相应。
在我们用C语言且没有实现回调函数时,实现一个简易计算器通常是这样的:
#define _CRT_SECURE_NO_WARNINGS 1
#include
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");
printf("***************************\n");
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("%d\n", ret);
break;
case 0:
printf("退出计算器\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
这样写代码虽然是可以正常运行的,但是代码显得十分冗余,有许多的重复的代码:
在这种情况下,我们就可以利用回调函数来巧妙地解决这个问题:
#define _CRT_SECURE_NO_WARNINGS 1
#include
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 Cal(int (*p)(int, int))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = p(x, y);
printf("%d\n", ret);
}
void menu()
{
printf("***************************\n");
printf("***** 1.add 2. sub ****\n");
printf("***** 3.mul 4. div ****\n");
printf("***** 0.exit ****\n");
printf("***************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
Cal(Add);
break;
case 2:
Cal(Sub);
break;
case 3:
Cal(Mul);
break;
case 4:
Cal(Div);
break;
case 0:
printf("退出计算器\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
回调函数还有一个重要应用,就是在我们C语言的库函数提供的qsort(快速排序)中:
在qsort函数中就使用了回调函数,就是调用了compar这个函数:
#include
#include
#include
int compar(const void* e1, const void* e2)
{
return strcmp((char*)e1,(char*)e2);
}
void print(char arr[][10], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s ", arr[i]);
}
printf("\n");
}
int main()
{
char str_arr1[][10] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
int size = sizeof(str_arr1) / sizeof(str_arr1[0]);
qsort(str_arr1, size, sizeof(str_arr1[0]), compar);
print(str_arr1, size);
return 0;
}
运行结果为: