运算器的特殊实现方法
2016-04-29 22:03
260 查看
【理论分析篇】
首先我们先来看这样的几句代码:int *fun(int,int); int (*pfun)(int,int); int (*ppfun[5])(int,int); int (*(*pppfun)[5])(int,int);
看到这几句代码,是不是感觉要晕啦!不过不要怕!我们开始一句一句的分析:
.int *fun(int,int)
是一个有两个整形参数的函数,而且它的返回值是int *类型的.
1.函数指针
.int (*pfun)(int,int).是一个函数指针,顾名思义,首先它是一个指针,指向的是一个函数,从本质上说它就是函数的指针;函数指针就是一个指针它的返回值类型为int,而且它具有两个整形的参数.
2.函数指针数组
.int(*ppfun[5])(int,int).是函数指针数组,我们可以发现这句代码相对于第二句代码多了一个代表数组标志的方括号,这是函数指针数组与函数指针的区别之一,函数指针数组就是数组中的每一个元素都是指向函数的指针.
3.指向函数指针数组的指针
.int(*(*pppfun)[5])(int,int).是指向函数指针数组的指针,在本质上依然是个指针,这个指针指向的是一个数组,数组里面存放的是函数指针,不过它是指向函数指针数组的指针.
【理论实践篇】
函数指针的使用范例
实现一个运算器,包括加法,减法,乘法和除法,使用函数指针我们知道函数指针就是指向函数的指针,我们可以通过传不同参数的地址实现不同的功能,代码实现如下:
void menu() { printf("**0.退出**\n"); printf("**1.加法**\n"); printf("**2.减法**\n"); printf("**3.乘法**\n"); printf("**4.除法**\n"); } int Add(int num1, int num2) //加法 { return num1+num2; } int Sub(int num1, int num2) //减法 { return num1-num2; } int Mul(int num1, int num2) //乘法 { return num1*num2; } int Div(int num1, int num2) //除法 { if(num2 != 0) //判断除数是否是零 return num1/num2; return 0; } int Operate(int (*pfun)(int , int)) //函数指针 { int num1 = 0; int num2 = 0; printf("请输入两个操作数>:"); scanf("%d%d",&num1, &num2); return pfun(num1, num2); } int (*arr[5])(int , int) = {0, Add, Sub, Mul, Div}; //转移表 int main() { int ret=0; int input = 1; while(input) { menu(); printf("请选择你要进行的操作>:"); scanf("%d",&input); if(input>= 1 && input<= 4) { ret = Operate(arr[input]); printf("操作后的结果为:%d\n", ret); } else if(input == 0) { system("pause"); return 0; } else { printf("选择错误\n"); } } system("pause"); return 0; }
以上代码实现中并没有添加头文件,读者可自行添加,以上就是我个人对函数指针,函数指针数组和指向函数指针数组的指针的理解,如果有完美的地方请大家指出。
相关文章推荐
- hdoj1025Constructing Roads In JGShining's Kingdom【LIS】
- HP滤波原理浅学
- poj 3608(旋转卡壳求解两凸包之间的最短距离)
- mxnet创建新的操作(层)
- hdu1698 Just a Hook(成段更新+懒惰标记)
- 深入研究 Visual Studio Code for Golang
- android apk编译过程(1)
- 【LeetCode】Invert Binary Tree 解题报告
- Java中接口与抽象类比较
- java 接口学习
- Unity中使用几何着色器制作类似于纪念碑谷的海(Unity几何着色器的一个例子)
- 简单的java程序
- B - Frogger HOJ
- 支付宝的SDK 编译 #include <openssl/asn1.h> not found
- 事件对象实现线程同步
- 实用知识:CoreLocation的使用(位置获取)
- 《校园封神榜》个人工作总结——第十天
- OC 点语法
- Servlet的生命周期
- java语言的特点