指针进阶2

紧接着我们上一讲,指针进阶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我们就讲到这里啦,谢谢大家 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值