您的位置:首页 > 其它

通过转移表练习函数指针的使用

2015-12-06 23:29 106 查看
通过了解指针我们直到了一些常规类型的指针
int a=1;  //整形变量
char b='1';  //字符型变量
int *p1=&a;   //指向整形指针
char *p2=&b;  //指向字符型的指针
....
p1是一个指向整形的指针,p2是一个指向字符型的指针,同样我们也接触了一些高级的指针
int **pp=&p1;   //二级指针  pp是指向指针的指针
int (*p3)[10];  //数组指针 p3指向的是大小为10个整形空间的数组
int *p4[10];    //指针数组   p4是个数组 数组的每个元素都是一个整形指针
int (*pfun1)(int,int);  //函数指针   指针pfun1是指向一个接收两个int型参数的返回值为整形的函数
int (*pfun2[10])(int,int); //函数指针的数组  pfun2是一个数组它可以存放10个函数指针的地址
int (*(*q)[10])(int,int);  //指向函数指针数组的指针 q是指向可以存放10个函数指针的数组

这里我们联系使用函数指针的数组来实现一个简单的计算器

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
double add1(double a, double b)    //  +
{
return a + b;
}
double sub1(double a, double b)    //  -
{
return a - b;
}
double mul1(double a, double b)    //  *
{
return a*b;
}
double div1(double a, double b)    //  /
{
if (0 == b)
{
printf("math error!\n");
return EXIT_FAILURE;
}
else
return a / b;

}                                //可以加更多的运算
int main()
{
int choose = 1;
double result = 0;
double num1 = 0;
double num2 = 0;
double(*pfun[])(double, double) = { add1, sub1, mul1, div1 };//函数指针的数组
while (choose)
{
system("cls");
printf("   1.+    2.-  \n");
printf("   3.*    4./  \n");
printf("   0.exit      \n");
printf("choose the function:");
scanf("%d", &choose);

if (0 == choose)
{
system("pause");
return 0;
}
else
{
printf("please enter the nums:");
scanf("%lf %lf", &num1, &num2);
result = pfun[choose - 1](num1, num2);   //通过函数指针来调用相应的函数
printf("%lf\n", result);
getchar();
printf("Press any key to continue");
getchar();
}
}
system("pause");
return 0;
}
但是我们为什么要这样写呢?

当我第一次拿到这个题目的时候我首先也想到的是使用switch case语句不是很好实现吗?

我们设置case标签来识别运算符号,不是很简单的就能写出代码吗?

但是想一想我们计算器真正能实现的功能远远不止与加减乘除,真正的计算器实现的功能估计也有个上百种,这样的switch case语句是不是看起来非常之庞杂!!

但是下面只一句代码就可以取代所有的switch case语句

result = pfun[choose - 1](num1, num2);   //通过函数指针来调用相应的函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: