【问题标题】:Why can't I convert a two-dimensional array to a two-dimensional pointer in C?为什么我不能在 C 中将二维数组转换为二维指针?
【发布时间】:2011-11-25 02:49:49
【问题描述】:

为什么下面的程序会给出'conversion' : cannot convert from int[1][1] to int** 错误?我在 Windows 7 下用 VS2008 编译。

int main(){
    int a[1][1] = {0};
    int **p = a;
}

【问题讨论】:

  • 数组不是指针。 数组不是指针.

标签: c arrays pointers


【解决方案1】:

您只能将数组转换为指针一次。 “指针 == 数组”抽象从第二级开始中断。

你可以的

int (*p)[1] = a; //convert an array of arrays of length 1
                 // to a pointer to arrays of length 1

但很明显,如果您在每种情况下都看到内存布局,则无法将多维数组转换为指针到指针:

//multidimentional arrays (a[][])
a -> [first row][second row][...]

//pointers to pointers (**p)
p -> [p0][p1][p2]
      |    |   |
      |    |   \-> [third row]
      |    \-----> [second row]
      \----------> [first row]

在指针到指针的方法中,行不一定是连续的,需要有一个额外的数组用于指向各个行的脊椎。

【讨论】:

  • 我想,数组总是连续的..?
  • 如果你真的想要,可以连续分配第二种情况的数据,但是没有办法摆脱那个额外的数组来存储指向行的指针.
【解决方案2】:

aints数组的数组,所以它可以衰减为指向第一个元素的指针,即ints数组。所以需要如下声明指针:

int (*p)[1] = a;

更抽象地说,如果你有一个数组T a[N];,那么a 会衰减为T*。在你的情况下,你有T = int[M],所以T* = int(*)[M]

【讨论】:

  • 这对我来说实际上是一个更有用的解释,因为我已经尝试转换为 int *[M](结果是一行指针,而不是指向一行的指针)。与运算符优先级不同,邻接问题很直观。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
相关资源
最近更新 更多