700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 进阶C语言 - 指针(3):函数指针数组

进阶C语言 - 指针(3):函数指针数组

时间:2019-08-11 21:09:37

相关推荐

进阶C语言 - 指针(3):函数指针数组

目录

6. 函数指针数组

那么函数指针数组有什么用呢?

写一个计算器:实现简单的加减乘除

函数指针和函数指针数组的区别:

用函数指针和函数指针数组来实现计算器的区别:

6. 函数指针数组

函数指针数组,是个数组,是用来存放函数指针的数组。

这是指针数组:

观察红色部分,发现指针数组和它存放的指针只是parr[3]和pa的区别

于是得到函数指针数组:

那么如何调用呢?

代码实现:

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;}#include <stdio.h>int main(){int(*arr[4])(int, int) = { Add, Sub, Mul, Div };//函数名就是函数的地址,将函数的地址存放在函数指针数组中int i = 0;for (i = 0; i < 4; i++){printf("%d\n", arr[i](4, 2));//调用函数//通过arr[i]找到每个函数名,通过函数名调用函数}return 0;}

那么函数指针数组有什么用呢?

写一个计算器:实现简单的加减乘除

用函数指针数组,大大减少了重复代码。转移表

#include <stdio.h>void menu(){printf("*******************************\n");printf("******* 1. add *********\n");printf("******* 2. sub **********\n");printf("******* 3. mul **********\n");printf("******* 4. div **********\n");printf("******* 0. exit **********\n");printf("*******************************\n");}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 input = 0;int x = 0;int y = 0;int ret = 0;int (*pf_arr[])(int, int) = { 0,Add,Sub,Mul,Div };//函数指针数组是直接将不同的函数名存到了数组中,//通过数组下标就可以访问数组中的不同函数名,从而找到对应的函数进行函数调用do{menu();printf("请选择:>");scanf("%d", &input);if (input == 0){printf("退出计算器\n");}else if ((input >= 1) && (input <= 4)){printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = pf_arr[input](x, y);printf("%d\n", ret);}else{printf("选择错误\n");}} while (input);return 0;}

为什么说大大减少了重复代码呢?

来看下面的做法:(实现一个计算器)

#include <stdio.h>void menu(){printf("*******************************\n");printf("******* 1. add *********\n");printf("******* 2. sub **********\n");printf("******* 3. mul **********\n");printf("******* 4. div **********\n");printf("******* 0. exit **********\n");printf("*******************************\n");}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 input = 0;int x = 0;int y = 0;int ret = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = Add(x, y);printf("%d\n", ret);break;case 2:printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("%d\n", ret);break;case 3:printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("%d\n", ret);break;case 4:printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = Div(x, y);printf("%d\n", ret);break;case 0:printf("退出计算器\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

于是进行改进:

函数指针的做法:

函数名传过来用函数指针接收,

通过传过来的不同函数名,可以找到对应的函数进行函数调用

//计算void calc(int(*pf)(int, int))//函数名传过来用函数指针接收{ //通过传过来的不同函数名,可以找到对应的函数进行函数调用int x = 0;int y = 0;int ret = 0;printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);}int main(){int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:calc(Add);break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf("退出计算器\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

函数指针数组的做法:

函数指针数组是直接将不同的函数名存到了数组中,

通过数组下标就可以访问数组中的不同函数名,从而找到对应的函数进行函数调用

int main(){int input = 0;int x = 0;int y = 0;int ret = 0;int (*pf_arr[])(int, int) = { 0,Add,Sub,Mul,Div };//函数指针数组是直接将不同的函数名存到了数组中,//通过数组下标就可以访问数组中的不同函数名,从而找到对应的函数进行函数调用do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:case 2:case 3:case 4:printf("请输入操作数:>");scanf("%d %d", &x, &y);ret = pf_arr[input](x, y);printf("%d\n", ret);break;case 0:printf("退出计算器\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

是不是感觉函数指针和函数指针数组的做法更简单呢,大大减少了代码的重复率。

当然,下面这两部分代码的功能是一样的。

那么,我们可能会产生疑问,函数指针和函数指针数组有什么区别呢?用函数指针和函数指针数组来实现计算器又有什么区别呢?

函数指针和函数指针数组的区别:

函数指针是指向函数的指针,里面存放的是函数的地址,可以是函数名,从而通过函数名找到对应的函数,进行函数调用。

函数指针数组是存放函数指针的数组,里面存放的是不同函数的地址,可以是不同的函数名,我们可以通过数组下标访问数组中的元素(函数名),从而通过函数名找到对应的函数,进行函数调用。

用函数指针和函数指针数组来实现计算器的区别:

函数指针实现计算器:函数名传过来用函数指针接收,通过传过来的不同函数名,可以找到对应的函数进行函数调用

函数指针数组实现计算器:函数指针数组是直接将不同的函数名存到了数组中,通过数组下标就可以访问数组中的不同函数名,从而找到对应的函数进行函数调用

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。