前言:小伙伴们又见面啦,今天我们来讲解一个将函数,指针,数组这三个C语言大将整合在一起的知识——函数指针数组。同时来告诉小伙伴们我们上一篇文章的伏笔——函数指针的具体用法。
目录
我们前边已经学习过了函数指针,也学习过指针数组,那么什么是函数指针数组呢???

这里要告诉大家,只要哪个名词在最后,就说明它的本质是这个名词,所以函数指针数组的本质,就是一个数组。而这个数组存放的是什么东西呢——函数指针。
OK,那么已经知道了函数指针数组是什么东西之后,我们来思考一下怎么来表示它。
这个其实简单,它是一个数组,是一个存放函数指针类型的数组,我们参考之前讲过的函数指针和指针数组的表示方法,得出函数指针数组的形式为:
void (* arr[])(void ,void) = { };
arr[]代表它是数组,把arr[]去掉,剩下的void (*)(void , void)则表示其存放的类型为函数指针。
OK,现在我们已经清楚了函数指针数组的形式,那么该怎么具体使用它呢???
假设我们现在要写一个代码模拟实现计算器的加、减、乘、除:
- #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 a;
- int b;
- int input;
- int ret;
- do {
- Menu();
- printf("请选择->:");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- printf("请输入两个运算数:");
- scanf("%d %d", &a, &b);
- ret = Add(a, b);
- printf("%d\n", ret);
- break;
- case 2:
- printf("请输入两个运算数:");
- scanf("%d %d", &a, &b);
- ret = Sub(a, b);
- printf("%d\n", ret);
- break;
- case 3:
- printf("请输入两个运算数:");
- scanf("%d %d", &a, &b);
- ret = Mul(a, b);
- printf("%d\n", ret);
- break;
- case 4:
- printf("请输入两个运算数:");
- scanf("%d %d", &a, &b);
- ret = Div(a, b);
- printf("%d\n", ret);
- break;
- case 0:
- printf("退出计算器\n");
- break;
- default:
- printf("输入错误,请重新输入:\n");
- break;
- }
- } while (input);
- return 0;
- }
我们将四则运算写成函数形式,并通过do-while循环和switch-case语句来实现计算器的加、减、乘、除功能。
但是我们能看出,这样的写法是不是太过于繁琐,很多语句都重复使用了很多次。
我们已经把四则运算写成了函数,而且我们也知道怎么用指针调用函数,那么我们现在是不是可以考虑:将这些函数全放在一个数组中,在通过数组去调用是不是更加的简洁方便呢???
下面我们就用函数指针数组来实现一下:
- #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 a;
- int b;
- int input;
- int ret;
- int(*Calarr[])(int, int) = { NULL,&Add,&Sub,&Mul,&Div };
- do {
- Menu();
- printf("请选择->:");
- scanf("%d", &input);
- if (input == 0)
- {
- printf("退出计算器\n");
- }
- else if (input >= 1 && input <= 4)
- {
- printf("请输入两个操作数:");
- scanf("%d %d", &a, &b);
- ret = Calarr[input](a, b);//调用
- printf("%d\n", ret);
- }
- else
- {
- printf("输入错误,请重新输入:\n");
- }
- } while (input);
- return 0;
- }
来看用函数指针数组来实现。
我们将四个函数的地址都通过函数指针来保存在数组中,但是我们知道,数组的下标是从0开始的,那么我们希望选择的数字和计算器选择数达成一致,便在数组下标为0的位置放一个NULL空指针。这时候我们的输入数input就可以帮助我们从数组中调用对应的函数来实现运算。
这样的代码是不是比上边的简单整洁多了。
当我们想要同时管理多个函数时,便可以使用函数指针数组,这便是函数指针数组的实际用法。
函数指针数组有关的知识和用法的讲解到这里就结束啦。其实这部分内容还是很好理解哒。
最后不要忘记一键三连呀!
我们下期再见!
