指针(4)---转移表

2024-06-18 15:21:13 浏览数 (1)

在C语言中,转移表是一个指针数组,通常的作用是用来提高代码的可读性和维护性,也就是使得代码更加“好看”。

例如:

现在要求写一个关于计算器的代码用于基本的四则运算。

一般的写法:

代码语言:javascript复制
//设置加减乘除的函数以便后续调用
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;
}
//主函数实现计算器,并假设输入1为加法,2为减法,3为乘法,4为除法
int main()
{
 int x, y;
 int input = 1;
 int ret = 0;
 scanf("%d", &input);
 switch (input)
 {
 case 1:
 printf("输⼊两个数:");
 scanf("%d %d", &x, &y);
 ret = add(x, y);
 printf("ret = %dn", ret);
 break;
 case 2:
 printf("输⼊两个数:");
 scanf("%d %d", &x, &y);
 ret = sub(x, y);
 printf("ret = %dn", ret);
 break;
 case 3:
 printf("输⼊两个数:");
 scanf("%d %d", &x, &y);
 ret = mul(x, y);
 printf("ret = %dn", ret);
 break;
 case 4:
 printf("输⼊两个数:");
 scanf("%d %d", &x, &y);
 ret = div(x, y);
 printf("ret = %dn", ret);
 break;
}
 return 0;

这种做法相当于使用switch语句来达到分支选项的实现,但是我们认为该代码的可读性以及长度都可以进行优化。我们可以使用一个函数指针数组(也就是一个转移表)来优化它。

代码语言:javascript复制
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, y;
 int input = 1;
 int ret = 0;
 int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
 printf( "请选择:" );
 scanf("%d", &input);
 printf( "输⼊操作数:" );
 scanf( "%d %d", &x, &y);
 ret = (*p[input])(x, y);
 printf( "ret = %dn", ret);
}

首先从长度上我们发现明显短了不少;其次我们可以注意到原先向纵向延伸的一系列选择(加减乘除)变为了横向延伸,函数指针数组可以使得函数在数组内元素变化的情况下直接被使用,这也脱离了switch语句的限制。

总而言之,操作表的使用可以大大提高程序的执行效率。

0 人点赞