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

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-04-10 08:17:15
中东停火不到24小时,美国就调转枪口对准中国,F-35密集“压境”

中东停火不到24小时,美国就调转枪口对准中国,F-35密集“压境”

史说芳华
2026-04-10 14:16:15
燃气费大涨?无锡华润燃气回应

燃气费大涨?无锡华润燃气回应

无锡eTV全媒体
2026-04-10 05:43:46
退休11年零11个月,他还在家里喝茶,纪委的车停在了楼下

退休11年零11个月,他还在家里喝茶,纪委的车停在了楼下

娱乐小可爱蛙
2026-04-10 12:13:35
王思聪韩国约会“小金晨”,女伴五官立体超美!网友向懒懒告密

王思聪韩国约会“小金晨”,女伴五官立体超美!网友向懒懒告密

无处不风景love
2026-04-10 12:26:08
71岁,茶刚倒上,纪委敲门:2012年的账,还记得吗?

71岁,茶刚倒上,纪委敲门:2012年的账,还记得吗?

宝哥精彩赛事
2026-04-10 12:20:39
国民党有两个党主席:一个地上,一个地下

国民党有两个党主席:一个地上,一个地下

雪中风车
2026-02-26 08:36:13
陈丽华告别仪式!孙女手捧遗像,迟重瑞站家属首位,儿子很悲伤

陈丽华告别仪式!孙女手捧遗像,迟重瑞站家属首位,儿子很悲伤

180视角
2026-04-09 17:30:14
“永不变质”的B站,要在暂停页面插广告了

“永不变质”的B站,要在暂停页面插广告了

3DM游戏
2026-04-10 09:48:05
就在一夜之间,美国突然宣布将4个国家列为“敌人”

就在一夜之间,美国突然宣布将4个国家列为“敌人”

人生录
2026-04-09 21:55:14
杨尚昆晚年回忆道:党内那么多人,山头也多,只有毛主席能拢得住

杨尚昆晚年回忆道:党内那么多人,山头也多,只有毛主席能拢得住

史韵流转
2026-04-08 09:42:46
朋友圈里没见到第二位是这个

朋友圈里没见到第二位是这个

熊太行
2026-04-10 12:10:33
大批航班被取消,五一出行旅客最先遭殃

大批航班被取消,五一出行旅客最先遭殃

环球旅讯
2026-04-09 17:23:24
除了周恩来谁还能胜任新中国总理?毛主席说出他的名号,一致点头

除了周恩来谁还能胜任新中国总理?毛主席说出他的名号,一致点头

元哥说历史
2026-04-10 14:00:03
日本兵再次踏上菲律宾!五国磨刀霍霍,中国却笑了:你们来晚了

日本兵再次踏上菲律宾!五国磨刀霍霍,中国却笑了:你们来晚了

Ck的蜜糖
2026-04-10 13:31:13
可怕!法国博主评全红婵被网暴事件:黑子真正目的是逼人退出体坛

可怕!法国博主评全红婵被网暴事件:黑子真正目的是逼人退出体坛

谈史论天地
2026-04-10 13:27:18
陈丽华葬礼现场!遗体已火化,迟重瑞眼睛哭肿,姜昆张纪中送花圈

陈丽华葬礼现场!遗体已火化,迟重瑞眼睛哭肿,姜昆张纪中送花圈

180视角
2026-04-09 13:22:54
王楚钦冠军仅1天,奥委会就这样评价他,16字一针见血,字字戳心

王楚钦冠军仅1天,奥委会就这样评价他,16字一针见血,字字戳心

梦录的西方史话
2026-04-10 14:28:17
紫牛热点∣康师傅绿茶再来1瓶无法兑换?网友:跑了好多门店兑换,处处“碰壁”

紫牛热点∣康师傅绿茶再来1瓶无法兑换?网友:跑了好多门店兑换,处处“碰壁”

扬子晚报
2026-04-09 22:23:11
惨遭AK-47毒打!坠机现场掉出核专家证件?美军抢铀阴谋瞒不住了

惨遭AK-47毒打!坠机现场掉出核专家证件?美军抢铀阴谋瞒不住了

沧海一书客
2026-04-10 13:30:52
2026-04-10 15:15:00
C语言Plus
C语言Plus
为大家分享编程相关知识
34文章数 532关注度
往期回顾 全部

科技要闻

马斯克狂发大火箭也养不起AI 年亏50亿美元

头条要闻

牛弹琴:巴基斯坦被以色列激怒了 这是一个不祥的信号

头条要闻

牛弹琴:巴基斯坦被以色列激怒了 这是一个不祥的信号

体育要闻

17岁赚了一百万美元,25岁被CBA裁员

娱乐要闻

夏克立婚内出轨 曾参加《爸爸去哪儿》

财经要闻

爱尔眼科一院长被指猥亵 总部:已被停职

汽车要闻

搭载第二代刀片电池及闪充技术 腾势N8L闪充版预售35万起

态度原创

家居
艺术
亲子
旅游
公开课

家居要闻

复古风格 自然简约

艺术要闻

于小冬2026年4月油画新作《花季》

亲子要闻

手外纪事|第57期 束带宝宝,父母没有放弃治疗,换来孩子一个未来

旅游要闻

亚洲游客抛弃中东,扎堆邮轮与短途游

公开课

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

无障碍浏览 进入关怀版