紧接着我们上一讲,指针进阶1,让我们趁热打铁,学习一下指针进阶2~
一,函数指针数组
由第一讲我们可以知道:(由于我们知道数组是存放一种类型的多个元素,若两个函数指针相同的话,那我们是不是可以都存放在数组里呢?)
让我们来看一下函数指针的用途:
让我们先看一个例子:(计算器的四则运算)
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 {
meau();
printf("请选择:>");
scanf_s("%d", &input);
switch (input) {
case 1:printf("请输入两个操作数");
scanf_s("%d%d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:printf("请输入两个操作数");
scanf_s("%d%d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个操作数");
scanf_s("%d%d", &x, &y);
printf("%d\n", ret);
ret = Mul(x, y);
break;
case 4:
printf("请输入两个操作数");
scanf_s("%d%d", &x, &y);
printf("%d\n", ret);
ret = Div(x, y);
break;
case 0:printf("退出游戏"); break;
default:printf("选择错误");
break;
}
} while (input);
}
当我们想要实现两位操作数的&& || & | %,我们发现我们Switch语句会越来越多,代码会发生冗余,这时候为了计算机的方便性,我们需要改造代码;那我们如何改造呢?
这时候我们可以使用函数指针数组,数组存放 +-*/的函数的地址
//计算器(函数指针数组)-----转移表
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 {
meau();
printf("请选择:>");
scanf_s("%d", &input);
int(*pf[])(int,int)={NULL,Add,Sub,Div,Mul};
// 0 1 2 3 4
if(0==input)
{
printf("退出游戏“”);
}
else if(1>=input&&input<=4)
{
prinf("输入两个操作数:);
}
else{
printf("重新输入");
} while (input);
}
当我们看一下改造的代码,这种写法不会增加Switch的语句啰嗦,但是有个小小的缺陷,即就是返回函数类型的时候,必须都为int类型,如果类型不同,则不能使用这种方法了
二,回调指针(依赖函数指针)
eg:用计算器的例子来实现
通过这个图片,我们可以看到 中间的calc函数像是一个中转站
大家可以看到,加减乘除的函数我们并没有直接去调用,而是把图左边的case 1等中calc()中的这些函数放到中间的calc函数,在calc函数内部使用的函数指针去调用 图右边 的Add Sub等函数,此时ret就是回调函数
让我们看一下回调函数的案例:qsort
让我们回顾一下冒泡排序:
我们可以知道,这个代码函数只能排序固定类型的数据,那我们要是想排序不同类型的数据,这该怎么办呢?这个时候我们使用qsort函数
让我们测试下qsort排序结构体类型:
1按照年龄比较:
2,按照名字比较
好啦~指针进阶2我们就讲到这里啦,谢谢大家