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

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.

相关推荐
热点推荐
陈幸同4:3张本美和,谁注意到看台上的王曼昱陈熠,心里好受些了

陈幸同4:3张本美和,谁注意到看台上的王曼昱陈熠,心里好受些了

桃叶渡春
2026-01-11 06:05:14
索要奖金、猥亵女队员、夫人吃空饷?亚运会三金得主王莉再发声,此前称不敢再呆在家中

索要奖金、猥亵女队员、夫人吃空饷?亚运会三金得主王莉再发声,此前称不敢再呆在家中

新民周刊
2026-01-10 18:49:33
特斯拉中国又推出新优惠方案,这也太夸张了!

特斯拉中国又推出新优惠方案,这也太夸张了!

XCiOS俱乐部
2026-01-11 11:19:46
马斯克称AGI今年就将实现!20年内所有商品服务都将接近免费

马斯克称AGI今年就将实现!20年内所有商品服务都将接近免费

第一财经资讯
2026-01-11 13:26:10
麦当劳缩水实锤?网友爆料供应商早换了,评论区一言难尽,为啥

麦当劳缩水实锤?网友爆料供应商早换了,评论区一言难尽,为啥

你食不食油饼
2026-01-11 08:41:12
俄驻委大使披露详情:马杜罗及妻子被控制时,身边实际上没有任何人;防空系统的远程预警站通信出了问题

俄驻委大使披露详情:马杜罗及妻子被控制时,身边实际上没有任何人;防空系统的远程预警站通信出了问题

扬子晚报
2026-01-11 11:42:19
湖人输球太冤?詹皇晒照不满打手没哨 裁判报告最后两分钟无误判

湖人输球太冤?詹皇晒照不满打手没哨 裁判报告最后两分钟无误判

罗说NBA
2026-01-11 06:03:14
太解气了,2026殡葬新规要来了,以后办白事再也不用当"冤大头"了

太解气了,2026殡葬新规要来了,以后办白事再也不用当"冤大头"了

知鉴明史
2026-01-11 10:35:03
隐私部位全被切,浙江男子瞬间崩溃!医生:不能拖啊

隐私部位全被切,浙江男子瞬间崩溃!医生:不能拖啊

台州交通广播
2026-01-10 01:48:58
两局激战失利!王祉怡惜败世界第一,无缘大马公开赛女单冠军

两局激战失利!王祉怡惜败世界第一,无缘大马公开赛女单冠军

全景体育V
2026-01-11 13:09:53
洗碗机大反转!砸家男越看越冤,知情人曝更多,难怪丈夫会崩溃

洗碗机大反转!砸家男越看越冤,知情人曝更多,难怪丈夫会崩溃

八斗小先生
2026-01-10 15:30:07
特朗普:自己不拿下格陵兰岛,俄罗斯或中国就会拿下,网友反驳:这是个谎言

特朗普:自己不拿下格陵兰岛,俄罗斯或中国就会拿下,网友反驳:这是个谎言

大象新闻
2026-01-11 00:13:15
数千万波斯人,不伺候阿塞拜疆权贵了?伊朗今夜,就是百年前清末

数千万波斯人,不伺候阿塞拜疆权贵了?伊朗今夜,就是百年前清末

南宗历史
2026-01-10 16:15:24
两个中国最“硬”的男人:一个给国家交税1400亿却家破人亡,一个喝掉2吨茅台把亏损厂干到万亿,这才是顶级狠人!

两个中国最“硬”的男人:一个给国家交税1400亿却家破人亡,一个喝掉2吨茅台把亏损厂干到万亿,这才是顶级狠人!

寄史言志
2026-01-09 18:47:15
神权集团用机枪射杀50人,抗议武装攻陷伊朗多市,油田也控制了

神权集团用机枪射杀50人,抗议武装攻陷伊朗多市,油田也控制了

史政先锋
2026-01-10 15:28:35
解放军战机飞过宫古海峡,日方极力隐藏的秘密,被中方发现了

解放军战机飞过宫古海峡,日方极力隐藏的秘密,被中方发现了

空天力量
2026-01-11 13:17:27
女子面试收到66元红包和感谢信,网友大赞“神仙公司”,负责人:应聘者付出了时间和诚意,我们应该感谢

女子面试收到66元红包和感谢信,网友大赞“神仙公司”,负责人:应聘者付出了时间和诚意,我们应该感谢

极目新闻
2026-01-11 12:58:16
彻底清零!缅甸KK园区635栋涉赌诈建筑全数炸毁

彻底清零!缅甸KK园区635栋涉赌诈建筑全数炸毁

看看新闻Knews
2026-01-11 12:45:02
高市早苗欲重选一把,这是怎样的豪赌?

高市早苗欲重选一把,这是怎样的豪赌?

新民晚报
2026-01-11 08:46:45
东契奇被打内幕曝光!斯罗德直冲更衣室,隔人动手,艾顿挡不住

东契奇被打内幕曝光!斯罗德直冲更衣室,隔人动手,艾顿挡不住

阿泰希特
2026-01-11 11:42:29
2026-01-11 15:40:49
C语言Plus
C语言Plus
为大家分享编程相关知识
34文章数 532关注度
往期回顾 全部

科技要闻

“我们与美国的差距也许还在拉大”

头条要闻

伊朗警告特朗普:若遭攻击 必将还击

头条要闻

伊朗警告特朗普:若遭攻击 必将还击

体育要闻

詹皇晒照不满打手没哨 裁判报告最后两分钟无误判

娱乐要闻

网友偶遇贾玲张小斐崇礼滑雪

财经要闻

外卖平台"烧钱抢存量市场"迎来终局?

汽车要闻

2026款宋Pro DM-i长续航补贴后9.98万起

态度原创

本地
时尚
教育
健康
公开课

本地新闻

云游内蒙|“包”你再来?一座在硬核里酿出诗意的城

朱珠美上热搜的老钱风穿搭,太值得借鉴了!

教育要闻

考上研究生后才知道,原来硕士导师和本科老师不一样,后悔太天真

这些新疗法,让化疗不再那么痛苦

公开课

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

无障碍浏览 进入关怀版