复杂指针声明解析

复杂指针声明解析

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

    指针为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型的函数指针的数组的指针!

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

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

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

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


相关推荐

  • snmptrap使用[通俗易懂]

    snmptrap使用[通俗易懂]SNMP简单网络管理协议,其中其支持的一个命令snmptrap命令,用于模拟向管理机发送trap消息。启动陷阱方法:snmptrapd-C-c/etc/snmp/snmptrapd.conf-Lf/var/log/net-snmptrap.log例如:snmptrap-v1-cpublic192.168.2.124.1.3.6.1.4.1…

    2022年8月21日
    5
  • Socket和DatagramSocket的区别[通俗易懂]

    Socket和DatagramSocket的区别[通俗易懂]简而言之就是:Socket使用的tcp连接,需要先连接之后才能发送数据。DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。DatagramSocket:客户端发送(直接发送数据,没有连接的过程):protectedvoidconnectServerWithUDPSocket(Contextcontext,Stringid…

    2022年6月11日
    41
  • Tomcat appBase[通俗易懂]

    <Hostname=”localhost”appBase=”webapps”unpackWARs=”true”autoDeploy=”true”><Contextpath=”project_name”docBase=”/usr/local/…

    2022年4月18日
    148
  • LLDP协议、STP协议 笔记

    LLDP协议、STP协议 笔记参考:数据链路层学习之LLDP生成树协议LLDP协议、STP协议笔记LLDP提出背景:随着网络技术的发展,接入网络的设备的种类越来越多,配置越来越复杂,来自不同设备厂商的设备也往往会增加自己特有的功能,这就导致在一个网络中往往会有很多具有不同特性的、来自不同厂商的设备,为了方便对这样的网络进行管理,就需要使得不同厂商的设备能够在网络中相互发现并交互各自的系统及配置信息。L…

    2022年6月2日
    31
  • mycat实现读写分离_mybatis读写分离实现

    mycat实现读写分离_mybatis读写分离实现环境:四台主机,两台mysql做主从:master和slave一台mysql做测试,ip:10.30.162.142一台mycat做读写分离,ip:192.168.122.230客户端访问mycat端的虚拟数据库mycat端虚拟数据库设定如下:user:adminpassword:redhatmycat通过一个真实数据库授过权的用户来对数据库端进行数据的操作,在这个实验中这个用户为m…

    2022年10月13日
    2
  • Scrapy项目 – 数据简析 – 实现腾讯网站社会招聘信息爬取的爬虫设计

    Scrapy项目 – 数据简析 – 实现腾讯网站社会招聘信息爬取的爬虫设计一、数据分析截图本例实验,使用Weka3.7对腾讯招聘官网中网页上所罗列的招聘信息,如:其中的职位名称、链接、职位类别、人数、地点和发布时间等信息进行数据分析,详见如下图:图1-1Weka3.7分析界面图1-2职位数据ZeroR分析界面图1-3数据聚类分析界面图1-4数据Visualize分析界面二、数据分析结论由图2-1可知,随着应聘人数的…

    2022年5月2日
    55

发表回复

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

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