复杂指针声明解析

复杂指针声明解析

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

    指针为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)
上一篇 2022年2月5日 下午4:00
下一篇 2022年2月5日 下午5:00


相关推荐

  • 深入理解卷积层,全连接层的作用意义「建议收藏」

    深入理解卷积层,全连接层的作用意义「建议收藏」有部分内容是转载的知乎的,如有侵权,请告知,删除便是,但由于是总结的,所以不一一列出原作者是who。再次感谢,也希望给其他小白受益。首先说明:可以不用全连接层的。理解1:卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。理解2:从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会制度”。卷积核的个数相当于候选人,…

    2026年1月24日
    5
  • 带通滤波器幅频特性曲线图_滤波器和对讲机技术解析!「建议收藏」

    带通滤波器幅频特性曲线图_滤波器和对讲机技术解析!「建议收藏」滤波器是一种选频装置,可以使对讲机信号中特定的频率成分通过,而极大地衰减其它频率成分。但是关于滤波器是什么,估计非专业人士肯定是一头雾水,今天小编就整理了一些滤波器的知识,供大家参考:一、概述1、定义凡是可以使信号中特定的频率成分通过,而极大地衰减或抑制其他频率成分的装置或系统都称之为滤波器,相当于频率“筛子”。2、分类幅频特性如下:频率通带:能通过滤波器的频率范围。频率阻带:被滤波器抑…

    2022年5月31日
    34
  • flex垂直居中,最简单的方法之一

    flex垂直居中,最简单的方法之一display:flex;align-items:center;

    2022年5月26日
    36
  • 雷达干扰技术(四)雷达信号处理

    雷达干扰技术(四)雷达信号处理参考论文 杂波环境下雷达信号处理的 SystemVue 建模与仿真方法研究 作者 尹园威等雷达工作的电磁环境越来越复杂 充斥着各种杂波 噪声及干扰 如何从回波中提取到有效信息 准确 快速地检测到目标就显的至关重要 为了解决这一问题 各种先进的雷达信号处理技术不断应用于雷达设计中 导致雷达信号处理系统越来越复杂 如何在雷达上合理的应用不同的雷达信号处理技术就成了雷达研制人员必须解决的问题 雷达信号处理是指对观测信号进行分析 变换 综合等处理 具有抑制非期望信号 增强有用信号 估计信号的特征参数或信号模

    2026年3月26日
    2
  • pthread_t定义结构

    pthread_t定义结构linux下被定义为:在linux履行pthread_t它被定义为"unsignedlongint",参考这里Windows下这样定义:/**Generichandl

    2022年7月2日
    27
  • 如何成都java工程师

    如何成都java工程师当今社会不论什么职业的都需要一个不断学习的环节 java 工程师也一样 一个优秀的 java 工程师 java 的开发工具 开发技术在不断地发展 在校学生所能学到的东西很难跟得上发展的需要但是也不能说那些东西完全没有用 只有在完全理解了相应的基本技能之后你才能很轻松地掌握新的技能 java 技术都是一个循序渐进的过程 所以在学好学校所能提供的专业课程的基础上 更要努力提高自己的技能水平 nbsp nbsp nbsp 笨如郭靖

    2025年9月18日
    6

发表回复

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

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