C++ 的int*p[]
和int(*p)[]
的 区别
之前在上课的课件上看到了int*p[]和int(*p)[]的区别,之前老是觉得这两个是一个东西
1. int * p[3]
-
首先我们知道,
[]
的优先级是大于*
的,因此对于int*p[3]来说,首先解读到的是p[3],是这个一维的数组,数组中有三个元素,都是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]类型的指针;
因此,p[0]指向的就是{1,2,3}组成的大小为3的数组类型的首元素地址;
同理p[1]指向的就是{4,5,6}组成的大小为3的数组类型的首元素地址;
即*p一定指向的是一维数组的地址,**p才指向二维数组的地址
-