通过转移表练习函数指针的使用
2015-12-06 23:29
106 查看
通过了解指针我们直到了一些常规类型的指针
这里我们联系使用函数指针的数组来实现一个简单的计算器
当我第一次拿到这个题目的时候我首先也想到的是使用switch case语句不是很好实现吗?
我们设置case标签来识别运算符号,不是很简单的就能写出代码吗?
但是想一想我们计算器真正能实现的功能远远不止与加减乘除,真正的计算器实现的功能估计也有个上百种,这样的switch case语句是不是看起来非常之庞杂!!
但是下面只一句代码就可以取代所有的switch case语句
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); //通过函数指针来调用相应的函数
相关文章推荐
- 睡前小dp-hdu3853-概率dp
- linux中ctrl+z和ctrl+c的区别
- JVM注解@CallSensitive
- Python——函数的高级话题(1)
- 一些常用的控制行命令
- dos命令大汇总
- NSUserDefaults偶尔/有时候保存数据会失败/失效
- jq参数以及e.target
- java基本常识
- Jenkins学习之——(3)将项目发送到tomcat
- 12.06 JavaScript
- 面向对象
- Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
- Date
- Book Review of “The practice of programming” (Ⅲ)
- Eclipse上安装GIT插件EGit
- STM32F407之I2C总线(一)
- C如何通过被调函数修改主调函数普通变量的值
- css 入门基础知识
- Emacs笔记