近期的天气是真的冷啊,老铁们一定要照顾好自己呀,注意防寒保暖,没有你们我怎么活啊!
上次的指针2的末尾,给大家分享了两个有趣的代码,今天就先来讲一讲那两个代码:
两个有趣的代码:
去调用0地址处的函数.
函数指针数组:
函数指针数组是一个数组,其元素都是指向函数的指针。它的定义形式如下:
返回类型 (*指针数组名称[元素个数])(参数1类型, 参数2类型, ...);
其中,返回类型是函数的返回类型,指针数组名称是一个合法的标识符,元素个数是指针数组中元素的个数。参数类型是函数的参数类型。
例如,定义一个包含3个元素的函数指针数组,每个元素都指向返回类型为int,参数类型为int的函数,可以如下定义:
int (* PArray[3] ) (int);
PArray先和 [] 结合,说明 PArray是数组,数组的内容是 int (*)(int) 类型的函数指针。
这样,PArray就是一个包含3个元素的函数指针数组,每个元素都是指向返回类型为int,参数类型为int的函数的指针。
函数指针数组的使用:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>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 mune(void)
{printf("************************\n");printf("*****1,加法运算 ********\n");printf("*****2,减法运算 ********\n");printf("*****3,乘法运算 ********\n");printf("*****4,除法运算 ********\n");printf("*****0,退出计算 ********\n");printf("************************\n");}
int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;do{mune();printf("请选择:\n");scanf("%d", &input);switch (input){case 1:printf("请输入两个操作数:\n");scanf("%d %d", &x, &y);ret = Add(x, y);printf("%d\n", ret);break;case 2:printf("请输入两个操作数:\n");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("%d\n", ret);break;case 3:printf("请输入两个操作数:\n");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("%d\n", ret);break;case 4:printf("请输入两个操作数:\n");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;
}
这种方法相信大家都会的吧,就是我们前面知识的应用,就不和大家细说了。上面我们看见重复的代码太多了,而且我们以后想实现其他的运算就会变得很麻烦。
上述的方法,我们可不可以把它们进行封装到另一个函数里面呢,通过函数指针找到相应的函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int input = 0;
int x = 0;
int y = 0;
int ret = 0;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 mune(void)
{printf("************************\n");printf("*****1,加法运算 ********\n");printf("*****2,减法运算 ********\n");printf("*****3,乘法运算 ********\n");printf("*****4,除法运算 ********\n");printf("*****0,退出计算 ********\n");printf("************************\n");}void calc( int(*pf)(int, int))//函数指针
{printf("请输入两个操作数:\n");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}
int main()
{do{mune();printf("请选择:\n");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 (*parr[5]) (int, int) = { NULL,Add,Sub,Mul,Div };
前面加上一个空指针,这样我们在输入数字的时候就可以找到相应的函数(数组的下标是从0开始的)!
int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;do{mune();printf("请选择:\n");scanf("%d", &input);int (*parr[5]) (int, int) = { NULL,Add,Sub,Mul,Div };//这里的函数指针数组我们称为转移表if (input == 0){printf("退出计算器\n");}else if(input>=1 && input<=4){printf("请输入两个操作数:\n");scanf("%d %d", &x, &y);ret = parr[input](x, y);printf("%d\n", ret);}else{printf("输入错误,请重新输入!\n");}} while (input);return 0;
}
这样我们是不是就大大减少了我们的代码量了,而且如果想加上其他的方法,加在数组里面就可以了,但这只是其中一部分代码哈,前面的方法我没有写上。
好了,今天就到这里了,明天见哦,不要太想我哟!😊😊😊