本章重点内容:
- 字符指针
- 指针数组
- 数组指针
- 数组传参和指针传参
- 函数指针
- 函数指针数组
- 指向函数指针数组的指针
- 回调函数
- 指针和数组面试题的解析
⚡函数指针数组
我们之前了解了指针数组中的整形指针数组,知道它是一个数组,每个元素都是 int* 类型的指针,通过类比,我们可以推断出函数指针数组的每个元素都是一个函数指针。举一个例子吧,代码示例如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int a, int b)
{
return a + b;
}
int Sub(int a, int b)
{
return a - b;
}
int Mul(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
return a / b;
}
int main()
{
//存放函数指针的数组——函数指针数组
int (*pf[4])(int, int) = { Add,Sub,Mul,Div };
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%d ", pf[i](6, 4));
}
return 0;
}
运行结果如下:
⚡函数指针数组应用实例
实现一个计算器,代码示例如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
printf("*************************\n");
printf("****** 1:add 2:sub ******\n");
printf("****** 3:mul 4:div ******\n");
printf("****** 0.exit ******\n");
printf("*************************\n");
}
int Add(int a, int b)
{
return a + b;
}
int Sub(int a, int b)
{
return a - b;
}
int Mul(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
return a / b;
}
int main()
{
int x = 0;
int y = 0;
int input = 1;
int ret = 0;
//转移表
int (*pfArr[])(int, int) = { NULL,Add,Sub,Mul,Div };
//对应菜单的选项:0 1 2 3 4
int sz = sizeof(pfArr) / sizeof(pfArr[0]);
do
{
menu();
printf("请选择:");
scanf("%d", &input);
if (input == 0)
{
printf("退出计算器。");
}
else if (input < sz)
{
printf("输入操作数:");
scanf("%d %d", &x, &y);
printf("%d\n", pfArr[input](x, y));
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}
这个计算器的实例利用了函数指针数组的优势,避免使用switch case语句,从而大大缩减了代码纵长,但是使用前提是函数的返回类型,参数个数和参数类型必须一致。我们称这种函数指针数组为转移表。
感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。