一.函数指针
1.什么是函数指针?
函数指针也是指针,不过它指向的是函数的首地址。
体会下面一段代码:
int fun(){
printf("hello!!!\n");
return 10;
}
int main(){
printf("%d \n",fun());//调用fun函数
int (*p) ()=fun;
printf("%d \n",(*p)());
return 0;
}
可以看到两条语句执行的结果是一模一样的。
再观察下面这段 代码:
可见它指向的就是函数的首地址
2.怎样定义函数指针变量
例:①int (*p) (函数参数)
int:函数的返回值是int型的
②void (*p) ()
void:函数的返回值类型是void,函数没有参数
二.函数指针数组
它是数组,数组的元素是函数指针
例如:
①int (*p[10]) ()
定义了一个有10个元素的函数指针数组,它的每一个元素都是函数指针,函数指针的类型是int(*)()
②void (*q[20]) (int a,int (*p) () )
定义了一个由20个元素的函数指针数组,它的每一个元素都是函数指针,函数指针的类型是void(*) (int ,int (*) ()).
它的函数参数中一个是int,另一个是函数指针类型,int (*)()
三.转移表(表驱动)
通过函数指针数组实现
典型实例:计算器
运算器的函数:
double add(double a, double b) {
return a + b;
}
double minus(double a, double b) {
return a - b;
}
double mul(double a, double b) {
return a * b;
}
double divs(double a, double b) {
return a / b;
}
1.switch语句实现
int main() {
while (1) {
printf("=================================\n");
printf("1.加法\n");
printf("2.减法\n");
printf("3.乘法\n");
printf("4.除法\n");
printf("=================================\n");
printf("请输入您的选择:");
int choice;
scanf("%d", &choice);
double a, b;
double ret = 0;
switch (choice) {
case 1:
printf("请输入操作数:");
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
ret = add(a, b);
break;
case 2:
printf("请输入操作数:");
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
ret = minus(a, b);
break;
case 3:
printf("请输入操作数:");
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
ret = mul(a, b);
break;
case 4:
printf("请输入操作数:");
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
ret = divs(a, b);
break;
default:
printf("输入错误!!!\n");
break;
}
printf("result=%lf\n", ret);
}
return 0;
}
2.转移表实现
double(*p[5])() = { 0,add,minus,mul,divs };
while (1) {
printf("=================================\n");
printf("1.加法\n");
printf("2.减法\n");
printf("3.乘法\n");
printf("4.除法\n");
printf("=================================\n");
printf("请输入您的选择:");
int choice;
scanf("%d", &choice);
if (choice <= 4 && choice > 0) {
double a, b;
double ret = 0;
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
ret = p[choice](a, b);
printf("result=%lf\n", ret);
}
else {
printf("输入错误!!!\n");
break;
}
}
通过转移表,我们减少了代码的冗余情况,而且后期更加便于维护。