C语言之指针进阶之函数指针数组的使用

  • C语言之深入理解指针(进阶)中我们并没有讨论到函数指针数组的使用,本篇博客我们将讨论这个问题。
  • 函数指针数组的用途就是----------转移表
  • 当我们在代码中菜单中实现的所有函数的返回值,参数个数和参数类型完全相同时,我们便可以将主函数中的switch case语句用函数指针数组替换掉。
  • 举例如下:

例1:

  • 没有用函数指针数组的代码如下:
#include <stdio.h>

void print1()
{
	printf("hahhahahaha\n");
}
void print2()
{
	printf("sheena sheena sheena\n");
}
void print3()
{
	printf("over over over over over\n");
}
int main()
{
	int input = 1;
	while (input)
	{
		printf("-------------------menu--------------------\n");
		printf("----------------1.print1-------------------\n");
		printf("----------------2.print2-------------------\n");
		printf("----------------3.print3-------------------\n");
		printf("-------------------------------------------\n");
		printf("请选择菜单中的一项:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			print1();
			break;
		case 2:
			print2();
			break;
		case 3:
			print3();
			break;
		default:
			printf("选择错误!!!请重新选择\n");
			break;
		}
	}

	return 0;
}
  • 此时由于print1、print2、print3三个函数的函数返回值、参数个数都相同,我们就可以用函数指针数组替换掉主函数中的switch case语句。
  • 具体代码如下:
#include <stdio.h>

void print1()
{
	printf("hahhahahaha\n");
}
void print2()
{
	printf("sheena sheena sheena\n");
}
void print3()
{
	printf("over over over over over\n");
}
int main()
{
	int input = 1;
	void(*p[4])() = { 0, print1, print2, print3 };//定义一个函数指针数组
	while (input)
	{
		printf("-------------------menu--------------------\n");
		printf("----------------1.print1-------------------\n");
		printf("----------------2.print2-------------------\n");
		printf("----------------3.print3-------------------\n");
		printf("-------------------------------------------\n");
		printf("请选择菜单中的一项:");
		scanf("%d", &input);
		if((input >= 1) && (input <= 3))
		{
			(*p[input])();
		}
		else
		{
			printf("选择错误!!!请重新选择\n");
		}
	}

	return 0;
}
  • 根据上述代码我们可以将三个函数的地址存放到我们定义的函数指针数组中,然后若要调用三个函数,则只需访问函数指针数组中的任意一个值即可。

例2:

  • 没有用函数指针数组的代码如下:
#include <stdio.h>

int is_greater(int a, int b)
{
	if (a > b)
		return 1;
	else
		return -1;
}
int is_less(int a, int b)
{
	if (a < b)
		return 1;
	else
		return -1;
}
int is_equal(int a, int b)
{
	if (a == b)
		return 1;
	else
		return -1;
}

int main()
{
	int x = 0, y = 0;
	int input = 1;
	int(*p[4])(int x, int y) = { 0, is_greater, is_less, is_equal};
	while (input)
	{
		printf("-------------------menu------------------------\n");
		printf("----------------1.is_greater-------------------\n");
		printf("----------------2.is_less----------------------\n");
		printf("----------------3.is_equal---------------------\n");
		printf("-----------------------------------------------\n");
		printf("请选择菜单中的一项:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入要比较的两个数:");
			scanf("%d%d", &x, &y);
			printf("1表示正确,-1表示不正确:%d\n", is_greater(x, y));
			break;
		case 2:
			printf("请输入要比较的两个数:");
			scanf("%d%d", &x, &y);
			printf("1表示正确,-1表示不正确:%d\n", is_less(x, y));
			break;
		case 3:
			printf("请输入要比较的两个数:");
			scanf("%d%d", &x, &y);
			printf("1表示正确,-1表示不正确:%d\n", is_equal(x, y));
			break;
		default:
			printf("选择错误!!!请重新选择\n");
			break;
		}
	}

	return 0;
}
  • 用函数指针数组替换switch语句后,代码如下:
#include <stdio.h>

int is_greater(int a, int b)
{
	if (a > b)
		return 1;
	else
		return -1;
}
int is_less(int a, int b)
{
	if (a < b)
		return 1;
	else
		return -1;
}
int is_equal(int a, int b)
{
	if (a == b)
		return 1;
	else
		return -1;
}

int main()
{
	int x = 0, y = 0;
	int input = 1;
	int(*p[4])(int x, int y) = { 0, is_greater, is_less, is_equal};
	while (input)
	{
		printf("-------------------menu------------------------\n");
		printf("----------------1.is_greater-------------------\n");
		printf("----------------2.is_less----------------------\n");
		printf("----------------3.is_equal---------------------\n");
		printf("-----------------------------------------------\n");
		printf("请选择菜单中的一项:");
		scanf("%d", &input);
		if((input >= 1) && (input <= 3))
		{
			printf("请输入要比较的两个数:");
			scanf("%d%d", &x, &y);
			printf("1表示正确,-1表示不正确:%d\n", (*p[input])(x, y));
		}
		else
		{
			printf("选择错误!!!请重新选择\n");
		}
	}

	return 0;
}
  • 根据上述两种代码的对比,不难发现,若用函数指针数组来替换会省略掉很多重复的代码。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值