复杂指针声明解析

复杂指针声明解析

大家好,又见面了,我是全栈君。

    指针为C/C++提供了高效的操作。但指针也有非常多恼人之处,稍稍不注意就可能出现大问题了,当然,本文不讨论那些裸指针之类的兴许问题,我们须要先了解的应该是指针的声明!试想,假设连声明都无法看懂。又何谈使用呢?

    可能有人会说指针的声明这么简单,怎么可能看不懂。

那我们来看一个样例:

int (*(*x)[10]) ();

    看完它,不知各位是否还能继续说简单呢?以下我们就从主要的声明開始,一步一步理解这个复杂的指针声明到底是什么。

先从一个最简单的样例開始:

int *p;

一个最简单的int型指针。但我更倾向于称呼它指向int型变量的指针,如此称呼并非刻意复杂化。而是它将对我们理解复杂指针有非常大作用!再看一个样例:

int (*p)[10];

相信这个形式非常多人已经非常熟悉了,在编写代码时使用二维数组会用到,但又有不少人会将它与 int *p[10] 相混淆。我们就从这个样例来介绍复杂指针的阅读。

    首先,我们须要了解运算符的优先级:[] > () > *。在 int (*p)[10] 中,我们知道括号能够改变运算顺序,使得*p被先作用。则我们将它理解为p是1个指针。括号内运算完成后,p就遇到了[]下标訪问运算符,此时我们将它理解为p是1个数组。综上。我们是否应该将 int (*p)[10] 理解为包括10个指针的数组呢?这样我们就错了,还记得前文最简单的指针的理解么,对于此处。括号用于改变运算顺序。使得 * 用于强调p是1个指针,指针总要有指向吧!所以括号内运算完成后遇到了[]。好了。指向就有了。p是1个指向含有10个元素的数组的指针,最后。再来看基本类型int,我们就能得到完整的理解了:p是1个指向含有10个int型元素的数组的指针。

    了解了这样的阅读的方法,我们来解读一个样例试试身手:

int (*(*p)())[10];

从最内层括号開始。p是1个指针,然后。p是1个指向形參列表为空的函数的指针。这里就有一个我们须要注意的问题了,由于p是1个函数指针。我们知道。函数三要素:返回值,形參列表,函数体。对于声明来说,函数体是不必介绍的,但返回值和形參列表必须提出来。形參列表已经提过了,所以我们须要将剩下的运算统统视为返回值部分,我们了解这样的使用方法 

int (*x)[10],所以接下来我们就得到了返回值部分。

综上,p就是1个指向返回值为int (*)[10]类型,形參列表为空的函数指针。

    说了这么多,一定还有人对开头的样例感到好奇吧。

它是什么呢?我们接下来再说道说道:(*x)[10]表明x是1个指向含有10个元素的数组的指针,然后遇到 * ,x即是1个指向含有10个指针元素的数组的指针,括号内运算结束。遇到(),x即是1个指向含有10个形參列表为空的函数指针的数组的指针,最后看返回值,我们就得到了终于结果:x是1个指向含有10个形參列表为空,返回值为int型的函数指针的数组的指针!

    非常绕对吧,只是细致思考一番。理解了它,复杂声明也就像纸老虎一般不足为惧了!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115351.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最长上升子序列nlogn算法

    最长上升子序列nlogn算法最长上升子序列nlogn算法题目描述:给定一个整型数组,求这个数组的最长严格递增子序列的长度。譬如序列12243的最长严格递增子序列为1,2,4或1,2,3.他们的长度为3。输入:输入可能包含多个测试案例。对于每个测试案例,输入的第一行为一个整数n(1输入的第二行包括n个整数,代表这个数组中的数字。整数均在int范围内。

    2022年6月2日
  • matlab中wavedec2,说说wavedec2函数【图】

    matlab中wavedec2,说说wavedec2函数【图】说说wavedec2函数【图】08-10栏目:技术TAG:wavedec2wavedec2http://maiqiuzhizhu.blog.sohu.com/110325150.htmlcopyrightjhua.orgwavedec2函数:copyrightjhua.org1.功能:实现图像(即二维信号)的多层分解.https://www.jhua.org多层,即多尺度.www.jhua…

    2022年6月29日
  • AI图像处理算法岗位整理[通俗易懂]

    AI图像处理算法岗位整理[通俗易懂]职位详情工作职责:负责开发Webex音视频媒体引擎,在windows,mac,ios,android,linux等平台上开发多媒体编解码,图像处理等算法。负责算法的逻辑,性能调优,汇编优化,或者GPU算法实现。对算法的设计,实现,调试,优化,测试以及metrics统计负责。职位要求:精通C/C++,在至少某一个开发平台上有5年以上产品开发经验对性能优化有丰富经验,理解如何设计高性能算法或者调试性能问题精通多线程编程,能利用多线程优化算法。熟悉arm或者x86汇编指令,intrinsic指

    2022年5月16日
  • 学生信息管理系统数据库课程设计「建议收藏」

    学生信息管理系统数据库课程设计「建议收藏」一.概述学生信息管理系统是学校管理的重要工具,是学校不可或缺的一部分。随着在校人数的不断增加,教务系统的数量也不断的上涨。学校工作繁杂,资料众多,人工管理信息的难度也越来越大,显然是不能满足实际的需要,效率也是很低的。并且这种传统的方式存在着众多的弊端,如:保密性差.查询不便.效率低,很难维护和更新等,然而,本系统针对以上的缺点能够极大的提高学生信息管理的效率,也是科学化.正规化的管理,与世界接轨…

    2022年5月19日
  • C语言股票交易软件,股票交易系统源程序代码

    C语言股票交易软件,股票交易系统源程序代码#include#include#include#includestructStock{charName[10];intfloatfloat};structStockS[5]={{“桂冠电力”,0},{“华北制药”,0},{“ST金泰”,0},{“伊利股份”,0},{“柳州重工”,0}};flag;//1买入2卖出0都是不Pri[20];Pri…

    2022年6月15日
  • bind-chroot和dnssec技术实战

    bind-chroot和dnssec技术实战安装部署bind-chroot系统环境服务器:腾讯云主机,有公网IPOS:CentOSLinuxrelease7.4.1708(Core)bind-chroot:bind-chroot-9

    2022年7月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号