函数指针数组的应用-转移表

函数指针数组的概念

数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组, ⽐如:

数组的每个元素是int*类型。

而函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的,比如:

那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?如图:

即在函数指针的基础上加上[],[]中为元素个数。

parr1 先和 [] 结合,说明 parr1是数组,数组的内容是 int (*)(int x, int y) 类型的函数指针。

函数指针数组实现转移表

接下来我们来实现一个计算器,之后通过函数指针数组进行改进。

计算器的一般实现:

//加法
int Add(int a, int b)
{
	return a + b;
}

//减法
int Sub(int a, int b)
{
	return a - b;
}

//乘法
int Mul(int a, int b)
{
	return a * b;
}

//除法
int Div(int a, int b)
{
	return a / b;
}

//菜单
void menu()
{
	printf("*************************\n");
	printf("****** 1.Add 2.Sub ******\n");
	printf("****** 3.Mul 4.Div ******\n");
	printf("******** 0.exit *********\n");
	printf("*************************\n");
}



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("ret = %d\n", ret);
			break;
		case 2:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);

	return 0;
}

从上面的代码我们可以看到,在switch语句中,除了各自使用的函数不同,其他的语句均相同,这就出现了冗余现象

那要怎么解决呢?

接下来我们使用函数指针数组对代码进行改进

如图,我们可以定义一个函数指针数组,将计算器中函数的地址放进数组中,当需要用到函数时,直接通过函数指针数组进行调用,这样就可以很好解决代码冗余问题。当然,为了方便数组中函数与用户选择使用的函数一致,下标为0的元素可以用0数字替代。

转移表的最终实现:

//加法
int Add(int a, int b)
{
	return a + b;
}

//减法
int Sub(int a, int b)
{
	return a - b;
}

//乘法
int Mul(int a, int b)
{
	return a * b;
}

//除法
int Div(int a, int b)
{
	return a / b;
}

//菜单
void menu()
{
	printf("*************************\n");
	printf("****** 1.Add 2.Sub ******\n");
	printf("****** 3.Mul 4.Div ******\n");
	printf("******** 0.exit *********\n");
	printf("*************************\n");
}

//函数指针数组
int (*p[])(int x, int y) = { 0, Add, Sub, Mul, Div };

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);

		if (input >= 1 && input <= 4)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = p[input](x, y);
			printf("ret = %d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出程序\n");
		}
		else
		{
			printf("选择错误\n");
		}

	} while (input);

	return 0;
}

注:在使用转移表的过程中,可以往函数指针数组添加其他函数,只要参数类型以及返回值类型相同即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值