函数指针数组的概念和应用

这篇具有很好参考价值的文章主要介绍了函数指针数组的概念和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数指针数组

是什么?

函数指数组是存放函数指针的数组

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

int main()
{
	int(*parr[4])(int, int) = { Add,Sub,Mul,Div };
	return 0;
}

上面是函数指针数组的一个应用,因为我们发现Add,Sub,Mul,Div这4个函数的参数和返回类型都一样,又因为函数名就表示函数的地址,所以我们把这4个函数的地址存放在函数指针数组parr里面。

书写小技巧:

我们书写函数指针数组时,先写上函数指针的形式,接着在名字后面加上数组的 [ ] 方括号,就可以完成对函数指针数组形式的书写。

有什么用?

我们来模拟实现一个计算器

下面是最基础的实现方式

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


int main()
{
	//int(*parr[4])(int, int) = { Add,Sub,Mul,Div };
	menu();
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		printf("请输入操作数\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出计算器\n");
			break;
		case 1:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("%d\n", ret);
			break;
		default:
			printf("输入非法,请重新输入\n");
			break;
		}
	} while (input);
	
	return 0;
}

函数指针数组的概念和应用,C语言,c语言,函数指针数组

 我们不难发现上述代码有两个明显的缺点

1、这种代码过于冗余,尤其是每个计算法则的内容,只有调用函数不一样,其余三行内容完全一致。

2、未来我们想在这个计算器里增加其他的运算法则,case语句会变的越来越多,里面的代码冗余现象也会越来越严重。

那如何去解决上述问题呢

那就需要我们的函数指针数组出马了!

int main()
{
	//int(*parr[4])(int, int) = { Add,Sub,Mul,Div };
	menu();
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		printf("请输入操作数\n");
		scanf("%d", &input);
		int (*parr[])(int, int) = { NULL,Add,Sub,Mul,Div };//保持下标与我们输入数字一致
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个数字\n");
			scanf("%d %d", &x, &y);
			ret = parr[input](x, y);
			printf("%d\n", ret);
		}
		else if (input == 0)
			printf("退出计算器\n");
		else
			printf("输入非法,请重新输入\n");
	} while (input);
	return 0;
}

注意当我们调用函数指针数组时,可以直接写数组名,然后后面括号写函数的参数。

不难看出,用函数指针数组求解不仅仅减少很多的代码量,也方便我们日后增加运算法则,直接在数组里面增加函数名即可。

指向函数指针数组的指针

相当于我们取了函数指针数组的地址进行存放,书写形式就是先写函数指针,接着再写函数指针数组,最后再写指向函数指针数组的指针。

int Add(int x, int y)
{
	return x + y;
}


int main()
{
	int(*p)(int, int);//先写函数指针
	int(*p[])(int, int)=Add;//然后在名字后面加上[],就是函数指针数组
	int (*( * pf)[])(int, int) = &p;//因为又是指针,所以再需要一个*,然后先把*和名字括起来
	return 0;
}

小技巧:

指针把*和名字去掉,剩下的就是指针指向的对象

数组把数组名和 [ ] 去掉,剩下的就是存放在数组中的类型。文章来源地址https://www.toymoban.com/news/detail-541370.html

到了这里,关于函数指针数组的概念和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (C语言)用函数指针数组实现计算器

    一、运算结果; 二、源代码;

    2024年01月19日
    浏览(31)
  • 复习第七课 C语言-指针数组,函数,string

    目录 【1】指针和数组 【2】数组指针 【3】指针数组 【4】函数 【5】函数传参 【6】动态开辟堆区空间 【7】string函数族 【8】递归函数 练习: 直接访问:通过数组名访问 间接访问:通过指针访问 》1. 一维数组 运算方法: 1) *和++都是弹幕运算符,优先级相同 2) 单目运算

    2024年02月16日
    浏览(28)
  • R语言【base】——apply():在数组边距上应用函数

    Package  base  version 4.2.0 返回通过将函数应用于数组或矩阵的边距而获得的向量或数组或值列表。 参数【X】 :一个数组,包括一个矩阵。 参数【MARGIN】 :一个给出下标的向量,函数将作用于这个下标。例如,对于矩阵, 1 表示行, 2 表示列, c(1,2) 表示行和列。其中 参数【

    2024年02月03日
    浏览(32)
  • C语言 ——指针数组与数组指针

    目录 一、二维数组 二、指针数组 (1)概念  (2)书写方式 (3)指针数组模拟二维数组 三、数组指针 (1)概念 (2)使用数组指针打印一维数组  (3)模拟二维数组的传参 首先,我们要理解一下二维数组和指针变量之间的一些相关概念。 二维数组 : int arr [ 3 ][ 5 ]  

    2024年02月13日
    浏览(38)
  • 【C语言进阶】指针数组 —— 数组指针

    🎬 鸽芷咕 : 个人主页  🔥 个人专栏 : 《C语言进阶篇》 《C语言初阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组!    ⛳️ 很多说这俩名字不是差不

    2024年02月14日
    浏览(28)
  • 【go语言基础】指针数组和数组指针

    (1)指针数组: 存储指针的数组,也叫存储地址的数组,简单说就是存储地址的。 首先它是一个数组,数组中的元素都是指针(地址)。 (2)数组指针: 首先它是一个指针,存储的是指向数组的指针。 (1)指针数组 定义: 注意:首先是一个数组,将数组中的元素定义为

    2024年02月13日
    浏览(39)
  • C语言:指针和数组(看完拿捏指针和数组)

    目录 数组名的理解: 一维数组:  解析:  字符数组:  解析:   解析: 字符串数组:  解析:   解析:  一级指针:   解析:   解析:  二维数组:  解析:  指针笔试题: 题一:一维数组 题二: 结构体指针 题三: 一维数组 题四: 二维数组 题五: 二维数组 题

    2024年02月11日
    浏览(32)
  • 【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        在这一篇博客中,我们要认识并理解 函数指

    2024年02月09日
    浏览(36)
  • 【C语言基础入门】二级指针、一维数组与指针、二维数组与指针

    在学习C语言的过程中,理解指针的概念是非常重要的。指针提供了一种直接访问内存地址的方式,使得我们可以更加灵活地管理数据和内存。在本文中,我们将介绍C语言中的二级指针、一维数组与指针,并通过通俗易懂的语言和示例代码来帮助读者理解这些概念。 二级指针

    2024年02月05日
    浏览(44)
  • 全面理解C++函数最难理解的部分:数组形参,函数指针,以及函数指针作为形参

    我提到的这些部分,是我在自学C与C++中遇到的比较困难的点。因为初学者的编程,不太容易使用到这些点,所以很容易造成遗忘,并且自己写很容易出错。 最近在看标准C库的源码的时候遇到了这样的困惑,就是关于函数指针,或者说,把一个函数作为另一个函数的参数的这

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包