复杂指针声明解析

复杂指针声明解析

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

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

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

那我们来看一个样例:

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

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

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

int *p;

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

int (*p)[10];

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

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

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

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

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

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

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

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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux怎么进入图形化界面_linux启动过程详解

    linux怎么进入图形化界面_linux启动过程详解GlassFish社区实现了开源JavaEE5应用服务器。GlassFish是一款强健的商业兼容应用服务器,达到产品级质量,可免费用于开发、部署和重新分发。GlassFish是用于构建JavaEE5应用服务器的开源开发项目的名称。它基于SunMicrosystems提供的SunJavaSystemApplicationServerPE9的源代码以及Or…

  • 创建选区快捷键是什么_Photoshop选区操作的快捷键

    创建选区快捷键是什么_Photoshop选区操作的快捷键1.使用快捷键快速操作.F1-帮助F2-剪切F3-拷贝F4-粘贴F5-隐藏/显示画笔面板F6-隐藏/显示颜色面板F7-隐藏/显示图层面板F8-隐藏/显示信息面板F9-隐藏/显示动作面板F12-恢复Shift+f5-填充Shift+f6-羽化Shift+f7-选择→反选ctrl+h-隐藏选定区域ctrl+d-取消选定区域ctrl+w-关闭文件ctrl+Q-退出PHOTOSHOPEsc-取消操作…

  • java中scanner意思_Java中的Scanner

    java中scanner意思_Java中的ScannerScanner对象是一个简单的文本扫描仪,**可以使用正则解析文本字符串**。我们使用Scanner最多的地方可能就是读取键盘输入,但是Scanner的功能远比此强大。对于Scanner的进一步理解还是在LeetCode的一道算法题上,题目大意是输入一组分式加法构成的字符串,要求输出分式相加的结果。首先是输入”-2/3+2/3-4/5″,接着求其和。首先第一步需要解析字符串为所需的数据,我使用了s…

  • 舵机控制原理详解「建议收藏」

    舵机控制原理详解「建议收藏」控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部

  • crontab的用法_crontab怎么读

    crontab的用法_crontab怎么读crontab命令参数-uuser:用来设定某个用户的crontab服务,例如,“-uixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入cronta…

  • docker pycharm 连接_pycharm远程连接docker开发[通俗易懂]

    docker pycharm 连接_pycharm远程连接docker开发[通俗易懂]1配置docker服务端(c/s架构)允许远程客户端连接-1vim/lib/systemd/system/docker.service…#ExecStart=/usr/bin/dockerd-Hfd://–containerd=/run/containerd/containerd.sockExecStart=/usr/bin/dockerd-Htcp://0.0.0.0:2…

发表回复

您的电子邮箱地址不会被公开。

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