有这样的代码:
int tab[14][2];
int (*wskk)[2] = tab; // &tab makes error
int tab2[2];
wskk = &tab2; // tab2 makes error
为什么可以使用一个指针指向两个不同维度的数组?
答案 0 :(得分:5)
要了解正在发生的事情,您必须熟悉一些关键概念:
wskk
的类型是“指向2 int
s的数组的指针。”因此,如果你写tab
,你就会得到一个指向tab
的第一个元素的指针,这是它的第一行;该行具有类型int[2]
,因此指向它的指针具有类型int (*)[2]
,这正是指针的类型。因此,您可以将tab
分配给wskk
,现在指向tab
的第一行。
你无法为其分配&tab
,因为这会产生一个指向整个多维数组的指针,类型为int (*)[14][2]
。
至于第二部分,它甚至更简单:tab2
是两个int
的数组,因此其类型为int[2]
。如果通过&
运算符获得指向它的指针,则会得到int (*)[2]
,这是指针的类型。实际上,它是有道理的:tab2
和一行tab
实际上是相同的东西(2 int
s的数组。)
你无法为其分配tab2
因为tab2
衰减到指向其第一个元素的指针,即int *
。
答案 1 :(得分:4)
使数组到指针的转换显式化,可能会更清楚:
int tab[14][2];
int (*wskk)[2] = &tab[0]; // point at tab[0], which has type array of 2 int
int tab2[2];
wskk = &tab2; // point at tab2, which has type array of 2 int