知识联合——函数指针数组

前言:小伙伴们又见面啦,今天我们来讲解一个将函数,指针,数组这三个C语言大将整合在一起 的知识------函数指针数组 。同时来告诉小伙伴们我们上一篇文章的伏笔------函数指针的具体用法


目录

一.什么是函数指针数组

二.函数指针数组的形式

三.函数指针数组的使用

四.总结


一.什么是函数指针数组

我们前边已经学习过了函数指针,也学习过指针数组,那么什么是函数指针数组呢???

这里要告诉大家,只要哪个名词在最后,就说明它的本质是这个名词 ,所以函数指针数组的本质,就是一个数组。而这个数组存放的是什么东西呢------函数指针

二.函数指针数组的形式

OK,那么已经知道了函数指针数组是什么东西之后,我们来思考一下怎么来表示它。

这个其实简单,它是一个数组,是一个存放函数指针类型的数组,我们参考之前讲过的函数指针和指针数组的表示方法,得出函数指针数组的形式为:

void (* arr\[\])(void ,void) = { };

arr\[\]代表它是数组把arr\[\]去掉,剩下的void (*)(void , void)则表示其存放的类型为函数指针

三.函数指针数组的使用

OK,现在我们已经清楚了函数指针数组的形式,那么该怎么具体使用它呢???

假设我们现在要写一个代码模拟实现计算器的加、减、乘、除

cs 复制代码
#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 a;
	int b;
	int input;
	int ret;
	do {
		Menu();
		printf("请选择->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Add(a, b);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Sub(a, b);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Mul(a, b);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Div(a, b);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("输入错误,请重新输入:\n");
			break;
		}
	} while (input);
	return 0;
}

我们将四则运算写成函数形式,并通过do-while循环和switch-case语句来实现计算器的加、减、乘、除功能。

但是我们能看出,这样的写法是不是太过于繁琐,很多语句都重复使用了很多次。

我们已经把四则运算写成了函数,而且我们也知道怎么用指针调用函数,那么我们现在是不是可以考虑:将这些函数全放在一个数组中,在通过数组去调用是不是更加的简洁方便呢???

下面我们就用函数指针数组来实现一下:

cs 复制代码
#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 a;
	int b;
	int input;
	int ret;
	int(*Calarr[])(int, int) = { NULL,&Add,&Sub,&Mul,&Div };
	do {
		Menu();
		printf("请选择->:");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数:");
			scanf("%d %d", &a, &b);
			ret = Calarr[input](a, b);//调用
			printf("%d\n", ret);
		}
		else
		{
			printf("输入错误,请重新输入:\n");
		}
	} while (input);
	return 0;
}

来看用函数指针数组来实现。

我们将四个函数的地址都通过函数指针来保存在数组中,但是我们知道,数组的下标是从0开始的 ,那么我们希望选择的数字和计算器选择数达成一致 ,便在数组下标为0的位置放一个NULL空指针 。这时候我们的输入数input就可以帮助我们从数组中调用对应的函数来实现运算。

这样的代码是不是比上边的简单整洁多了。

当我们想要同时管理多个函数时,便可以使用函数指针数组,这便是函数指针数组的实际用法。

四.总结

函数指针数组有关的知识和用法的讲解到这里就结束啦。其实这部分内容还是很好理解哒。

最后不要忘记一键三连呀!

我们下期再见!

相关推荐
CYLAM20252 小时前
STC32G12K128单片机实现高精度算法及常用初等函数值的计算
算法
奶人五毛拉人一块3 小时前
动态规划--子数组类型
算法·动态规划·子数组问题
是隼人3 小时前
buuctf-pwn PWN1题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
HugoStudio_SWAN3 小时前
洛谷 P1321 单词覆盖还原——从蜡板上的密信到数字水印
c++·学习·程序人生·算法
Lost of 程序猿3 小时前
.NET 线程安全集合与并发数据结构深度实战:从 lock 到无锁
数据结构·安全·.net
刘孬孬沉迷学习3 小时前
AI音频领域完整调研:任务、算法、大模型研究全梳理
人工智能·算法·音视频
zbyyd3 小时前
Linux 网络编程:IO 多路复用
linux·运维·c语言·网络
退休倒计时3 小时前
【每日五题】leetcode TypeScript
算法·leetcode·职场和发展·typescript
晊晌_h4 小时前
嵌入式从0到精通——Linux 网络通信|TCP、HTTP 网络编程
linux·c语言·网络
机器学习之心4 小时前
基于BiGRU-Attention的轴承剩余寿命预测(MATLAB实现):从振动信号到RUL曲线的完整闭环
数据结构·算法·matlab·轴承剩余寿命预测·振动信号·bigru-attention