【C语言进阶:指针的进阶】函数指针数组

本章重点内容:

  • 字符指针
  • 指针数组
  • 数组指针
  • 数组传参和指针传参
  • 函数指针
  • 函数指针数组
  • 指向函数指针数组的指针
  • 回调函数
  • 指针和数组面试题的解析

⚡函数指针数组

我们之前了解了指针数组中的整形指针数组,知道它是一个数组,每个元素都是 int* 类型的指针,通过类比,我们可以推断出函数指针数组的每个元素都是一个函数指针。举一个例子吧,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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;
}
int main()
{
	//存放函数指针的数组——函数指针数组
	int (*pf[4])(int, int) = { Add,Sub,Mul,Div };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d ", pf[i](6, 4));
	}
	return 0;
}

 运行结果如下:


⚡函数指针数组应用实例

实现一个计算器,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void menu()
{
	printf("*************************\n");
	printf("****** 1:add 2:sub ******\n");
	printf("****** 3:mul 4:div ******\n");
	printf("****** 0.exit      ******\n");
	printf("*************************\n");
}

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;
}

int main()
{
	int x = 0;
	int y = 0;
	int input = 1;
	int ret = 0;
	//转移表
	int (*pfArr[])(int, int) = { NULL,Add,Sub,Mul,Div };
	           //对应菜单的选项:0     1   2   3   4
	int sz = sizeof(pfArr) / sizeof(pfArr[0]);
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器。");
		}
		else if (input < sz)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			printf("%d\n", pfArr[input](x, y));
		}
		else
		{
			printf("选择错误\n");
		}
	} while (input);
	return 0;
}

这个计算器的实例利用了函数指针数组的优势,避免使用switch case语句,从而大大缩减了代码纵长,但是使用前提是函数的返回类型,参数个数和参数类型必须一致。我们称这种函数指针数组为转移表。


感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值