前面学习过数组 指针数组:用来存放数组指针(地址)的数组
int main()
{int arr1[] = { 0 };int arr2[] = { 0 };int arr3[] = { 0 };int* p[3] = { arr1,arr2,arr3 };//指针数组return 0;
}
那么函数指针数组,就是用来存放几个类型相同的函数地址(指针)的数组
我们用代码写一个计算器的例子:
函数指针数组的使用——计算器
之前我们想写一个简单的计算器是这样的:
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");}
int main()
{int stup = 0;int x = 0;int y = 0;int ret = 0;do{menu();printf("请选择>");scanf("%d", &stup);switch (stup){case 1:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret=ADD(x, y);printf("ret= %d\n", ret);break;case 2:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("ret= %d\n", ret);break;case 3:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("ret= %d\n", ret);break;case 4:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret = Div(x, y);printf("ret= %d\n", ret);break;case 0:printf("退出计算器>\n");break;default:printf("选择错误,请重新选择>\n");break;}} while (stup);//int(*p[4])(int, int) = { ADD,Sub,Mul,Div };return 0;
}
运行结果:
上述代码虽然可以实现计算机的功能但是我们发现
这段代码中出来函数名发生改变,其他的都没变,显的有一点冗余
那么我们是不是可以写一个函数指针数组来把这几个函数的地址存放在同一数组中,当想使用那个函数时,只需要找到这个函数地址对用的下标,然后就可以实现函数的调用了呢
利用此思路,我们来改造计算器代码
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");}
int main()
{int stup = 0;int x = 0;int y = 0;int ret = 0;int(*arr[5])(int, int) = {NULL,ADD,Sub,Mul,Div};
do
{menu();printf("请选择>");scanf("%d", &stup);if (stup >= 1 && stup <= 4){printf("请输入两个操作数>\n");scanf("%d %d", &x, &y);ret = arr[stup](x, y);printf("ret= %d\n", ret);}else if(stup==0){printf("退出计算器");}else{printf("选择错误重新选择>\n");}
} while (stup);return 0;
}