为什么我不能将二维数组转换为C中的二维指针?

时间:2011-11-25 02:49:50

标签: c arrays pointers

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

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

2 个答案:

答案 0 :(得分:6)

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

你可以做到

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]

在指向指针的方法中,行不一定是连续的,并且脊柱需要有一个指向各行的额外数组。

答案 1 :(得分:4)

aint s数组的数组,因此它可以衰减为指向第一个元素的指针,该元素是int的数组。所以你需要按如下方式声明指针:

int (*p)[1] = a;

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