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


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

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

    1. int * p[3]

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

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

    2. int (*p)[3]

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

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

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

        #例如对于下列的一维数组
        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;
        
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12

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

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

      • 假设对于一个二维数组

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

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

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

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

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

  • 相关阅读:
    18张图,我发现了国庆节的赚钱效应...
    08-8.2.1 插入排序
    【教师资格证考试综合素质——法律专项】教育法笔记以及练习题
    Springboot垃圾分类管理系统7o539计算机毕业设计-课程设计-期末作业-毕设程序代做
    springboot自行车在线租赁管理系统毕业设计源码101157
    题目 1059: 二级C语言-等差数列
    【深度学习】(三)图像分类
    终极GPU互联技术探索:消失的内存墙
    STM32初学-外部RTC时钟芯片DS3231
    git push 失败 shallow update not allowed
  • 原文地址:https://blog.csdn.net/weixin_44911248/article/details/134084970