- 在C语言之深入理解指针(进阶)中我们并没有讨论到函数指针数组的使用,本篇博客我们将讨论这个问题。
- 函数指针数组的用途就是----------转移表
- 当我们在代码中菜单中实现的所有函数的返回值,参数个数和参数类型完全相同时,我们便可以将主函数中的switch case语句用函数指针数组替换掉。
- 举例如下:
例1:
- 没有用函数指针数组的代码如下:
#include <stdio.h>
void print1()
{
printf("hahhahahaha\n");
}
void print2()
{
printf("sheena sheena sheena\n");
}
void print3()
{
printf("over over over over over\n");
}
int main()
{
int input = 1;
while (input)
{
printf("-------------------menu--------------------\n");
printf("----------------1.print1-------------------\n");
printf("----------------2.print2-------------------\n");
printf("----------------3.print3-------------------\n");
printf("-------------------------------------------\n");
printf("请选择菜单中的一项:");
scanf("%d", &input);
switch (input)
{
case 1:
print1();
break;
case 2:
print2();
break;
case 3:
print3();
break;
default:
printf("选择错误!!!请重新选择\n");
break;
}
}
return 0;
}
- 此时由于print1、print2、print3三个函数的函数返回值、参数个数都相同,我们就可以用函数指针数组替换掉主函数中的switch case语句。
- 具体代码如下:
#include <stdio.h>
void print1()
{
printf("hahhahahaha\n");
}
void print2()
{
printf("sheena sheena sheena\n");
}
void print3()
{
printf("over over over over over\n");
}
int main()
{
int input = 1;
void(*p[4])() = { 0, print1, print2, print3 };//定义一个函数指针数组
while (input)
{
printf("-------------------menu--------------------\n");
printf("----------------1.print1-------------------\n");
printf("----------------2.print2-------------------\n");
printf("----------------3.print3-------------------\n");
printf("-------------------------------------------\n");
printf("请选择菜单中的一项:");
scanf("%d", &input);
if((input >= 1) && (input <= 3))
{
(*p[input])();
}
else
{
printf("选择错误!!!请重新选择\n");
}
}
return 0;
}
- 根据上述代码我们可以将三个函数的地址存放到我们定义的函数指针数组中,然后若要调用三个函数,则只需访问函数指针数组中的任意一个值即可。
例2:
- 没有用函数指针数组的代码如下:
#include <stdio.h>
int is_greater(int a, int b)
{
if (a > b)
return 1;
else
return -1;
}
int is_less(int a, int b)
{
if (a < b)
return 1;
else
return -1;
}
int is_equal(int a, int b)
{
if (a == b)
return 1;
else
return -1;
}
int main()
{
int x = 0, y = 0;
int input = 1;
int(*p[4])(int x, int y) = { 0, is_greater, is_less, is_equal};
while (input)
{
printf("-------------------menu------------------------\n");
printf("----------------1.is_greater-------------------\n");
printf("----------------2.is_less----------------------\n");
printf("----------------3.is_equal---------------------\n");
printf("-----------------------------------------------\n");
printf("请选择菜单中的一项:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入要比较的两个数:");
scanf("%d%d", &x, &y);
printf("1表示正确,-1表示不正确:%d\n", is_greater(x, y));
break;
case 2:
printf("请输入要比较的两个数:");
scanf("%d%d", &x, &y);
printf("1表示正确,-1表示不正确:%d\n", is_less(x, y));
break;
case 3:
printf("请输入要比较的两个数:");
scanf("%d%d", &x, &y);
printf("1表示正确,-1表示不正确:%d\n", is_equal(x, y));
break;
default:
printf("选择错误!!!请重新选择\n");
break;
}
}
return 0;
}
- 用函数指针数组替换switch语句后,代码如下:
#include <stdio.h>
int is_greater(int a, int b)
{
if (a > b)
return 1;
else
return -1;
}
int is_less(int a, int b)
{
if (a < b)
return 1;
else
return -1;
}
int is_equal(int a, int b)
{
if (a == b)
return 1;
else
return -1;
}
int main()
{
int x = 0, y = 0;
int input = 1;
int(*p[4])(int x, int y) = { 0, is_greater, is_less, is_equal};
while (input)
{
printf("-------------------menu------------------------\n");
printf("----------------1.is_greater-------------------\n");
printf("----------------2.is_less----------------------\n");
printf("----------------3.is_equal---------------------\n");
printf("-----------------------------------------------\n");
printf("请选择菜单中的一项:");
scanf("%d", &input);
if((input >= 1) && (input <= 3))
{
printf("请输入要比较的两个数:");
scanf("%d%d", &x, &y);
printf("1表示正确,-1表示不正确:%d\n", (*p[input])(x, y));
}
else
{
printf("选择错误!!!请重新选择\n");
}
}
return 0;
}
- 根据上述两种代码的对比,不难发现,若用函数指针数组来替换会省略掉很多重复的代码。