C++ 的int*p[]和int(*p)[]的区别

C++ 的int*p[]和int(*p)[]的 区别

之前在上课的课件上看到了int*p\[\]和int(*p)\[\]的区别,之前老是觉得这两个是一个东西

1. int * p3

  • 首先我们知道,[]的优先级是大于*的,因此对于int*p3来说,首先解读到的是p3,是这个一维的数组,数组中有三个元素,都是int*,即int类型的指针。

    c++ 复制代码
    #即对于以下三个数组
    int a[2]={1,2};
    int b[2]={3,4};
    int c[2]={5,6};
    #int*p[3]会将数组中的三个指针分别只向a,b,c的首地址

2. int (*p)3

  • 由于()的优先级大于[],因此对于int(*p)[3]来说,首先是解读到*p,其被解释为一个指针,而其次才解释到 []。

    因此,这说明,这个指针指向的元素是一个长度为3的数组,并且*p表示的数组中第一个元素的地址

    • 假设对于一个一维数组a:

      c 复制代码
      #例如对于下列的一维数组
      int a[2]={1,2};
      int (*p1)[2]=&a;
      #此时的*p1是一个指针,它指向的数组长度为2,*p1的值为数组的的第一个元素的地址
      #因此如果想打印出2时,*p1+1指向2的地址,再取*为2的值
      cout<<**(p1+1)<<endl;
      
      #若我们使用 q的类型其实是int*[3]
      int*p2=a;
      #若需要打印出2
      cout<<*(p2+1)<<endl;

      因此,其说明其实对于int(*p1)[2]而言,其就是其数据类型应该是与&a相同的,而&q的类型是int*3

      所以p1可以看成一个二维指针,只不过a的所有元素都在二维数组中的其中一个维度里了。

    • 假设对于一个二维数组

      c++ 复制代码
      int a[2][3]={1,2,3,4,5,6};
      int(*)p[3]=a;
      #如果想打印2
      cout<<*(*p+1)<<endl;
      #如果想打印4
      cout<<*(*(p+1))<<endl;

      因此,如上述解释的,*p是可以看成一个二维指针,其中每个维度的类型为int*3类型的指针;

      因此,p0指向的就是{1,2,3}组成的大小为3的数组类型的首元素地址;

      同理p1指向的就是{4,5,6}组成的大小为3的数组类型的首元素地址;

      即*p一定指向的是一维数组的地址,**p才指向二维数组的地址

相关推荐
沐欣工作室_lvyiyi2 分钟前
家庭水资源节能系统设计(论文+源码)
c++·python·云平台·单片机毕业设计·单片机仿真·电子信息工程毕业设计·机械电子工程
Yyyyyy~18 分钟前
[c++]数组
c++
知识分享小能手25 分钟前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)
开发语言·c++·学习
2601_9622186133 分钟前
c++中多重继承与虚继承的实现
开发语言·c++
沫璃染墨43 分钟前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5
2601_962218611 小时前
C++中分配器allocator的实现
开发语言·c++
单片机设计·······2 小时前
【dz-1162】汽车前玻璃雨刮器设计
c++·单片机·嵌入式硬件
AI智讯中枢2 小时前
高性能 C++ 实战 (五):perf+FlameGraph 火焰图生产实战,精准定位 CPU / 缓存 / 锁瓶颈,避坑 + 完整实操案例
linux·c++·性能调优·性能分析·perf·flamegraph·火焰图
繁华的地方不一定留下你的脚印2 小时前
C++ 算法与 ranges:用 find_if、transform 写清数据处理意图
开发语言·c++·算法
张小姐的猫2 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt