详解函数指针数组

详解函数指针数组

书接上回,上一篇文章中我介绍了函数指针,它是指向函数的指针
今天我要介绍函数指针数组,顾名思义它是存放函数指针的数组.它可以看做把函数的地址存放在一个数组中,那这个数组就叫函数指针数组.

函数指针数组的声明

int (*parr[10])(int ,int);//声明了一个函数指针数组

在上述函数指针数组的声明中,定义了一个能存放10个函数指针类型元素的数组parr[10].

函数指针数组的应用实例

下面,我先展示如果不使用函数指针数组写一个具有加减乘除功能的计算器
代码如下:

#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 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("请选择\n");
		scanf("%d", &input);
		
		switch (input)
		{
		case 1:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("ret=%d", ret);
			break;
		case 2:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret=%d", ret);
			break;
		case 3:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret=%d", ret);
			break;
		case 4:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("ret=%d", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			break;
		}
	} while (input);

	return 0;
}

大家可以看到在Switch-case语句中该代码的冗杂部分过多.
如果在上述代码的基础上使用函数指针数组会怎么样?

#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 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;
	//函数指针数组
	int (*pfarr[5])(int, int) = { 0,add,sub,mul,div };//用0占下标
	//通过下标找到函数地址,进而达到调用函数的目的
	do
	{
		menu();
		printf("请选择\n");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = pfarr[input](x, y);//调用函数指针数组
			printf("ret=%d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	
	return 0;
}

肉眼可见,该代码的长度较之前减少很多
那么该函数指针数组是怎么调用的呢,上述代码中定义了一个存放函数地址的函数指针数组pfarr

int (*pfarr[5])(int, int) = { 0,add,sub,mul,div };

进而可以通过函数的地址找到对应函数并调用,实现加减乘除功能

 ret = pfarr[input](x, y);//函数指针数组的调用

再利用ret储存调用Pfarr[input]函数(实现简易计算器)的结果.

简化后的代码还有一个显著的好处就是如果再实现计算器的更多功能时,只需增加函数和在函数指针数组中添加元素(即函数名)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值