网易首页 > 网易号 > 正文 申请入驻

int (*(*func)[5])(int *p); 如何看懂复杂的指针声明?

0
分享至

指针大家都学过,简单的指针相信大家都不放在眼里,就不再赘述,但是复杂的你能理解吗?能理解指针就学的差不多了,至于如何运用只要你看懂指针就知道应该给它赋什么值,怎么调用。咱们先看一下标题上的一个指针,你认为是什么指针呢?


先告诉大家答案,然后再给大家分析如何解读,这是一个数组指针,数组的每个元素是都是一个函数指针,这类函数的参数是int型的指针,返回值是int型。
那么是怎么解读出来的呢?咱们先来了解一个法则:右左法则。
右左法则不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的。究竟右左法则的规律是什么呢?顾名思义,从声明的右边看到左边,下面是右左法则的专业解释:右左法则:首先从最里面的圆括号(应该是未定义的标识符)看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。 笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。

现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深: 1、int (*func)(int *p); 2、int (*func)(int *p, int (*f)(int*)); 3、int (*func[5])(int *p); 4、int (*(*func)[5])(int *p); 5、int (*(*func)(int *p))[5]; 6、int func(void) [5]; //错误7、int func[5](void); //错误上面的七个例子,可以自己先尝试解析一下,然后对照下面的答案看看自己为什么会弄错,并消化解析方法!
例题答案
1、int (*func)(int *p);

首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。

2、int (*func)(int *p, int (*f)(int*));

func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

3、int (*func[5])(int *p);

func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

4、int (*(*func)[5])(int *p);

func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

5、int (*(*func)(int *p))[5];

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

要注意有些复杂指针声明是非法的,例如:

6、int func(void) [5];

func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

7、int func[5](void);

func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。

作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在下一次指针讲解里。

int (*(*func)[5][6])[7][8];

int (*(*(*func)(int *))[5])(int *);

int (*(*func[7][8][9])(int*))[5];

实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:

int (*(*func)(int *p))[5];

可以这样分解:

typedef int (*PARA)[5]; typedef PARA (*func)(int *);

如果有正在学C/C++的小伙伴,可来我们的C/C++学习群哦:627819188,有免费视频教程。

小编也是一名从事了5年C/C++开发的工程师,花了近一个月整理了一份较适合19年学习的干货,

以及我这五年的工作经验,分享给每一位想学C/C++的小伙伴,这里是C/C++学习者聚集地,欢迎初学和进阶中的小伙伴。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
天网恢恢!表面是热心公益的华人会长,其实是绑架杀人,无恶不作

天网恢恢!表面是热心公益的华人会长,其实是绑架杀人,无恶不作

不与世俗同
2026-01-08 11:11:38
看到委内瑞拉的情况,李显龙在怕什么?

看到委内瑞拉的情况,李显龙在怕什么?

新民周刊
2026-01-09 09:09:48
又一行业没落!曾是世界第一,如今18家大国企几乎全军覆没

又一行业没落!曾是世界第一,如今18家大国企几乎全军覆没

朔方瞭望
2026-01-08 09:50:55
电诈“教父”陈志遣返中国,美国扣押的12.7万枚比特币应移交中国

电诈“教父”陈志遣返中国,美国扣押的12.7万枚比特币应移交中国

星空区块链
2026-01-07 21:14:37
洗澡可能影响寿命!医生再次提醒:51岁以后,牢记洗澡“4不要”

洗澡可能影响寿命!医生再次提醒:51岁以后,牢记洗澡“4不要”

39健康网
2026-01-08 20:18:51
港媒突然曝料澳门赌业大亨“洗米华”与千亿电诈头目存在巨额交易!陈志1000多亿资产被封,美国“偷走”九成

港媒突然曝料澳门赌业大亨“洗米华”与千亿电诈头目存在巨额交易!陈志1000多亿资产被封,美国“偷走”九成

澳门月刊
2026-01-09 09:18:41
四川高县一村支书暴打残疾村妇致轻伤二级!法院:免于刑事处罚!

四川高县一村支书暴打残疾村妇致轻伤二级!法院:免于刑事处罚!

兵叔评说
2026-01-07 12:13:15
中国养老负担将越来越重:从4.7个劳动力养一个老人到1.9个劳动力供养1个老人

中国养老负担将越来越重:从4.7个劳动力养一个老人到1.9个劳动力供养1个老人

西虹市闲话
2026-01-08 13:51:18
专家脸被打肿!2025年油车销量逆势暴涨,车主:终于明白了!

专家脸被打肿!2025年油车销量逆势暴涨,车主:终于明白了!

老特有话说
2026-01-07 00:30:03
全球用户大面积中招:鼠标突然就“坏了”!不少人按到“手抽筋”,重装卸载也不管用,罗技回应

全球用户大面积中招:鼠标突然就“坏了”!不少人按到“手抽筋”,重装卸载也不管用,罗技回应

每日经济新闻
2026-01-08 20:15:12
苦等2小时,官方:公牛主场对热火一战因球场出现水渍而延期

苦等2小时,官方:公牛主场对热火一战因球场出现水渍而延期

懂球帝
2026-01-09 11:00:00
美军狂追18天,最后一刻抢下俄超级油轮,俄海军终究晚来一步

美军狂追18天,最后一刻抢下俄超级油轮,俄海军终究晚来一步

军机Talk
2026-01-08 10:41:44
研究生教成人骑车2年赚27万元 当事人:市场需求大

研究生教成人骑车2年赚27万元 当事人:市场需求大

大象新闻
2026-01-09 08:13:04
伊朗巨变前夜

伊朗巨变前夜

凤眼论
2026-01-08 10:31:08
放过保时捷,咱换一家抄好不好?

放过保时捷,咱换一家抄好不好?

爱范儿
2026-01-08 18:16:20
朝鲜不会成为第二个委内瑞拉!因为朝鲜有两个后盾

朝鲜不会成为第二个委内瑞拉!因为朝鲜有两个后盾

米君文史
2026-01-07 10:01:47
美军7人负伤,古巴特种兵无人生还!委内瑞拉送美国数千万桶石油

美军7人负伤,古巴特种兵无人生还!委内瑞拉送美国数千万桶石油

鹰眼Defence
2026-01-08 17:44:29
美国衰落,就是一个巨大的谎言

美国衰落,就是一个巨大的谎言

枫冷慕诗
2026-01-06 12:28:30
网传某国产操作系统大厂老董开除核心工程师,理由竟是 “没穿西装”

网传某国产操作系统大厂老董开除核心工程师,理由竟是 “没穿西装”

可达鸭面面观
2026-01-08 19:48:13
男子与女友吵架飙车泄愤,情绪失控撞死1家3口,细节曝光:两人当时在讨论鹦鹉学舌

男子与女友吵架飙车泄愤,情绪失控撞死1家3口,细节曝光:两人当时在讨论鹦鹉学舌

极目新闻
2026-01-08 23:58:28
2026-01-09 11:43:00
C语言Plus
C语言Plus
为大家分享编程相关知识
34文章数 532关注度
往期回顾 全部

科技要闻

17.68万起售!何小鹏一口气发了4款车

头条要闻

12岁男孩在温泉池溺水身亡 父亲:身高1.4米水深1.1米

头条要闻

12岁男孩在温泉池溺水身亡 父亲:身高1.4米水深1.1米

体育要闻

世乒赛银牌得主,说自己梦里都是孙颖莎

娱乐要闻

檀健次恋爱风波越演越烈 上学经历被扒

财经要闻

郁亮的万科35年:从"宝万之争"到"活下去"

汽车要闻

上汽大众首款“9系旗舰” ID. ERA 9X实车曝光

态度原创

房产
数码
时尚
家居
公开课

房产要闻

豪宅抢疯、刚需捡漏……2025年,一张房票改写了广州市场格局

数码要闻

普通眼镜秒变AI眼镜:歌尔CES 2026展示外挂配件Rox-Vision

60+女性穿搭指南来了:4招告别“大妈感”,解锁冬日优雅气质

家居要闻

木色留白 演绎现代自由

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版