void(*p)(int);//p是函数指针变量的名字 typedef void(*pf_t)(int);//pf_t是一个新的类型名
这样我们的代码就能得到简化
void ( *signal( int, void(*)(int) ) )(int);//源代码 //简化后 pf_t siganal(int,pf_t);
这样是不是就更容易分辨了?
2函数指针数组2.1基本形式
既然函数指针也是一个指针类型,那我们就可以用指针数组来存放它
前提:这些函数的参数类型、返回类型一致
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; } //函数指针数组 int (*pfArr[4])(int, int) = {Add, Sub, Mul, Div};?
相比于分开写多次函数调用
//多次函数调用 int (*pf1)(int,int) = Add; int (*pf2)(int, int) = Sub; int (*pf3)(int, int) = Mul; int (*pf4)(int, int) = Div;
函数指针数组可以让我们以使用数组的形式来访问每个函数
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; } ? int main() { int (*pfArr[4])(int, int) = {Add, Sub, Mul, Div};//函数指针数组 int i = 0; for (i = 0; i < 4; i++) { //int ret = (*pfArr[i])(8, 4); int ret = pfArr[i](8, 4); ? printf("%dn", ret); } return 0; }?
这样也简化了我们的代码
2.2、计算器实现2.2.1switch语句
目的:实现一个计算器
菜单:用数字来选择运算类型
方法:以switch/case语句来实现函数调用
结束:用do/while实现多组输入,以及结束程序
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"); printf("**********************************n"); } ? int main() { int input = 0; int x = 0; int y = 0; int ret = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Add(x, y); printf("ret = %dn", ret); break; case 2: printf("输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Sub(x, y); printf("ret = %dn", ret); break; case 3: printf("输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Mul(x, y); printf("ret = %dn", ret); break; case 4: printf("输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Div(x, y); printf("ret = %dn", ret); break; case 0: printf("退出计算器n"); break; default: printf("选择错误n"); break; } } while (input); ? return 0; }?
这种方式需要写非常多的重复代码,而且代码长度很长????
我们可以使用函数指针对它进行优化
2.2.2函数指针形式int main() { int input = 0; int x = 0; int y = 0; int ret = 0; ? int (*pfArr[5])(int, int) = {0, Add, Sub, Mul, Div}; //pfArr是一个函数指针的数组,也叫转移表 do { menu(); printf("请选择:>"); scanf("%d", &input); if (input == 0) { printf("退出计算器n"); break; } else if (input >= 1 && input <= 4) { printf("输入2个操作数:>"); scanf("%d %d", &x, &y); ret = pfArr[input](x, y); printf("ret = %dn", ret); } else { printf("选择错误n"); } } while (input); ? return 0; }?
这样就避免了我们在每个case语句里都写上输入提示、scanf和不同的函数调用所导致的代码冗余了
运行试试吧!
文章插图
2.3指向函数指针数组的指针
函数指针数组是一个数组,数组可以用数组指针来存放地址
指向函数指针数组的指针:是一个指针
该指针指向一个数组,数组的每个元素都是一个函数指针
int Add(int x, int y) { return x + y; } int main() { int (*pa)(int, int) = Add;//函数指针 int (* pfA[4])(int, int);//函数指针的数组 int (* (*ppfA)[4])(int, int) = &pfA; //ppfA 是一个指针,该指针指向了一个存放函数指针的数组 return 0; }
3.相关练习题定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?下面哪个是正确的?
推荐阅读
- 初中二次函数的最值问题课件 中考二次函数最值典型例题
- 初中数学二次函数知识点梳理! 初中二次函数
- inputbox函数怎么用 inputbox在vb中什么意思
- 女人向男人分手的语言?女人对男人说分手,男人什么想法
- 好听的话别当真难听的话别较真图片-好听的话别当真难听的话别较真英文-
- 如何将二次函数一般式化成顶点式 二次函数的一般式怎么变为顶点式
- 康熙会说满语吗?清朝皇室说什么语言
- 山东数学高考三角函数试题及解析?2013山东高考数学理科试题及答案
- 对孩子说的正能量短句?鼓励孩子的语言正能量
- 掌握12种外语的语言达人教你12种有效学习法 语言学习