指针进阶:函数指针的应用场景

场景一:回调函数

上一篇文章我们写了回调函数作为冒泡排序的比较规则来实现调用者的多样化要求,其实这就是C语言中函数指针应用广泛的一种场景
链接放在下面啦,敬请垂阅:

冒泡排序(进阶):运用回调函数,模拟实现库函数qsort

场景二:转移表

我们来实现一个简易的计算器:


//来做一个简易的计算器
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 divide(int x, int y) {
	return x / y;
}
int main() {
	int x = 3, y = 4;
	printf("请选择:1.加法 2.减法 3.乘法 4.除法\n");
	int choice = 0;
	scanf("%d", &choice);
	printf("请输入你要操作的数:\n");
	scanf("%d %d", &x, &y);
	//根据用户输入的选择决定调用哪一个函数
	int ret = 0;
	if (choice == 1){
		ret = add(x, y);
	}
	else if (choice == 2){
		ret = sub(x, y);
	}
	else if (choice == 3){
		ret = mul(x, y);
	}
	else if (choice == 4){
		ret = divide(x, y);
	}
	else{
		printf("输入的choice有误!\n");
	}
		printf("%d\n", ret);
}

圈复杂度:
我们怎么理解圈复杂度呢?
一段代码的分支越多,就认为这个代码的可读性越差。
圈复杂度是衡量一段代码可读性的指标~
如果这段代码平铺直叙,没有任何的条件/循环,就认为圈复杂度是1
遇到一个条件,圈复杂度就+1,遇到循环也+1,这个值越大,就说明这个函数越复杂,越难管理~
我们来看看上面计算器中的这段代码:
在这里插入图片描述
很多公司的编程规范都对圈复杂度有明确约定~~
一般一个函数圈复杂度不应该超过10。
虽然当前代码圈复杂度没有超过10,但是需求在变更,总有一天会超过的.
试想一下,这个简易的计算器仅仅只有四个功能,就这么多条件,如果功能上升到几百几千呢?
那么在C语言中,这个问题是怎么解决的呢?

转移表的使用

//转移表的使用
//函数指针的声明
typedef int(*Func)(int, int);

int main()
{
	int x = 0, y = 0;
	printf("请选择:1.加法 2.减法 3.乘法 4.除法\n");
	int choice = 0;
	scanf("%d", &choice);
	printf("请输入你要操作的数:\n");
	scanf("%d %d", &x, &y);
	//函数指针数组
	Func arr[] = {                   
		NULL,        //传入NULL的目的是规范数组的下标     0
		add,         //                                1
		sub,         //                                2
		mul,		 //                                3
		divide		 //                                4
	};
	int ret = arr[choice](x, y);        //通过这种方法我们获取到函数指针,通过函数指针又获取到函数进行运算   直接降低了代码的圈复杂度
	printf("%d\n",ret);
	return 0;
}

使用函数指针用作转移表,大大降低了函数的圈复杂度,使整段代码可读性得到提高,也缩减了代码量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值