如何理解取消引用指向数组的指针获取指向元素的指针?

时间:2018-04-09 09:56:23

标签: c++ arrays pointers

我曾经对这些代码感到困惑

int a[3] = {1,2,3};
int b[2][3] = {...};
int (*p1)[3] = &a;  //pointer to array[3]
int (*p2)[3] = b; //same as above
int (*p3)[2][3] = &b; // pointer to array[2][3]

然后我阅读了一些帖子 1 并理解了数组名称的'神秘',包括一些显式和隐式转换。

所以现在我知道p1是指向数组的3个元素的指针,类型为int。

但如何理解*(int (*)[3])获取类型int *

*(int (*)[2][3]获取类型int (*)[3]

这是我应该死记硬背的东西吗?

<小时/> 帖子我读过:

Is an array name a pointer?

Difference between `a` and `&a` in C++ where `a` is an array

Array to pointer decay and passing multidimensional arrays to functions

<小时/> PS:我不知道这是不是一个愚蠢的问题。但看完我上面提到的帖子后。我对这种解除引用操作的东西仍感到有点奇怪。也许这就是语法语法如何工作,我应该记住并停止挖掘。 :d

1 个答案:

答案 0 :(得分:3)

首先,您应该了解array-to-pointer decay

  

从数组类型的左值和右值到指针类型的右值有一个隐式转换:它构造一个指向数组第一个元素的指针。每当数组出现在不期望数组的上下文中时,就会使用此转换,但指针是

例如,aint [3])可能会衰减为int *bint [2][3])可能会衰减为int (*)[3]

然后

  

如何理解*(int (*)[3])获取类型int **(int (*)[2][3]获取类型int (*)[3]

这取决于具体情况;更确切地说,给定p类型int (*)[3](即指向数组的指针),*p将得到数组(int [3]),它可以衰减到int *

同样,如果p类型为int (*)[2][3]*p将获得数组int [2][3],该数组可能会衰减为int (*)[3]