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

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.

相关推荐
热点推荐
今天最后一天!浙江天气即将上演反转,气温跌破20℃……

今天最后一天!浙江天气即将上演反转,气温跌破20℃……

FM93浙江交通之声
2025-11-02 06:05:10
韩华海洋宣布停止进口中国大白菜,反制中国制裁措施

韩华海洋宣布停止进口中国大白菜,反制中国制裁措施

我不叫阿哏
2025-11-02 12:57:14
74年毛主席指示释放全部战犯,看过名单后告周恩来:请他们吃顿饭

74年毛主席指示释放全部战犯,看过名单后告周恩来:请他们吃顿饭

南书房
2025-10-03 23:07:06
闺蜜让我当心男友,我婚前把房子卖了,婚后第3天婆婆露出真面目

闺蜜让我当心男友,我婚前把房子卖了,婚后第3天婆婆露出真面目

农村情感故事
2025-10-12 18:26:37
老年人行房最晚到多大年龄?或许很多人想错了!

老年人行房最晚到多大年龄?或许很多人想错了!

深度报
2025-09-11 23:05:16
1场6-3后,斯诺克第5席32强诞生!白雨露创纪录,周跃龙丢赛点!

1场6-3后,斯诺克第5席32强诞生!白雨露创纪录,周跃龙丢赛点!

刘姚尧的文字城堡
2025-11-02 13:04:08
美专家:抗美援朝若让粟裕代替彭德怀领兵,输的更惨!仅凭三点

美专家:抗美援朝若让粟裕代替彭德怀领兵,输的更惨!仅凭三点

南书房
2025-10-26 14:22:44
短剧尺度突破!原配丈夫孕检信息泄露,特殊职业引关注

短剧尺度突破!原配丈夫孕检信息泄露,特殊职业引关注

观察者海风
2025-11-02 14:54:23
黄晓明,在“油”和“去油”之间找到演员之路

黄晓明,在“油”和“去油”之间找到演员之路

后浪电影
2025-11-02 10:08:36
我为什么不想写太子集团的陈志?

我为什么不想写太子集团的陈志?

伢伢复盘
2025-11-02 09:06:28
“辞职看世界”的女老师,10年后成这样:黯然回乡,老公已分开

“辞职看世界”的女老师,10年后成这样:黯然回乡,老公已分开

热风追逐者
2025-10-24 01:15:03
台湾名嘴赖岳谦说,十年前当大陆提出2025年规划时

台湾名嘴赖岳谦说,十年前当大陆提出2025年规划时

老友科普
2025-11-02 14:24:11
江苏省规模较大的二十家医院

江苏省规模较大的二十家医院

王二哥老搞笑
2025-11-02 12:15:14
早上送孩子上学困难?网友:妈求你了,请天假吧

早上送孩子上学困难?网友:妈求你了,请天假吧

夜深爱杂谈
2025-11-01 22:59:47
黄平:我到过印度的贫民窟,那是中国人无法想象的第三世界

黄平:我到过印度的贫民窟,那是中国人无法想象的第三世界

扶苏聊历史
2025-10-31 17:34:04
莫齐抛弃华裔未婚妻,高攀英国公主,岳父没了爵位之后家里一团糟

莫齐抛弃华裔未婚妻,高攀英国公主,岳父没了爵位之后家里一团糟

户外小阿隋
2025-11-02 07:49:56
全红婵放弃全运单人角逐系顶层决策,并不仅仅是保护身体那么简单

全红婵放弃全运单人角逐系顶层决策,并不仅仅是保护身体那么简单

杨华评论
2025-11-01 19:30:01
大反转!冷空气即将抵达广东!最低温降至13℃!东莞天气……

大反转!冷空气即将抵达广东!最低温降至13℃!东莞天气……

东莞好生活
2025-11-02 09:28:49
杨瀚森发展联盟好刷数据?杨毅:人家拿球能给你么,姥姥!

杨瀚森发展联盟好刷数据?杨毅:人家拿球能给你么,姥姥!

老曁科普
2025-11-02 14:52:24
著名音乐人屠颖发生意外不幸离世,作品《情书》《味道》《过火》家喻户晓

著名音乐人屠颖发生意外不幸离世,作品《情书》《味道》《过火》家喻户晓

鲁中晨报
2025-11-01 19:03:04
2025-11-02 15:43:00
C语言Plus
C语言Plus
为大家分享编程相关知识
34文章数 532关注度
往期回顾 全部

科技要闻

10月零跑突破7万辆,小鹏、蔚来超4万辆

头条要闻

"最快女护士"张水华获得"复出"后首个全马冠军

头条要闻

"最快女护士"张水华获得"复出"后首个全马冠军

体育要闻

这个日本人,凭啥值3.25亿美元?

娱乐要闻

离世的他曾是刘德华张学友御用班底

财经要闻

段永平捐了1500万元茅台股票!本人回应

汽车要闻

神龙汽车推出“发动机终身质保”政策

态度原创

本地
数码
游戏
艺术
公开课

本地新闻

全网围观,到底多少人被这个野人大学生笑疯了

数码要闻

华为星闪起猛了!蓝牙技术全面应战,还针对中国市场出招

战舰世界黑五船集体返场!最值得入手TOP3排名,抽任何一艘都赚!

艺术要闻

被溥仪卖给日本的王羲之真迹,内藏20幅罕见手稿,揭露草书最深层奥秘!

公开课

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

无障碍浏览 进入关怀版