我曾经对这些代码感到困惑
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]
?
这是我应该死记硬背的东西吗?
<小时/> 帖子我读过:
Difference between `a` and `&a` in C++ where `a` is an array
Array to pointer decay and passing multidimensional arrays to functions
<小时/> PS:我不知道这是不是一个愚蠢的问题。但看完我上面提到的帖子后。我对这种解除引用操作的东西仍感到有点奇怪。也许这就是语法语法如何工作,我应该记住并停止挖掘。 :d
答案 0 :(得分:3)
首先,您应该了解array-to-pointer decay,
从数组类型的左值和右值到指针类型的右值有一个隐式转换:它构造一个指向数组第一个元素的指针。每当数组出现在不期望数组的上下文中时,就会使用此转换,但指针是
例如,a
(int [3]
)可能会衰减为int *
,b
(int [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]
。