指着阵列

时间:2011-09-30 16:53:20

标签: c++

有这样的代码:

int tab[14][2];
int (*wskk)[2] = tab; // &tab makes error

int tab2[2];
wskk = &tab2; // tab2 makes error

为什么可以使用一个指针指向两个不同维度的数组?

2 个答案:

答案 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

另请参阅:How do I use arrays in C++?