如何在C ++中将int [] []转换为int **

时间:2014-07-08 16:30:24

标签: c++ pointers

是否有一种简单的方法可以将int[n][n]类型的实例转换为int**? 例如,代码

void foo(int** arr) {
// ...
}
int X[10][10];
memset(X,0,10*10*sizeof(int));
foo(X); // error: cannot initialize a parameter of type 'int **' with an lvalue of type 'int [10][10]'

当然,一个简单的解决方法是

int** X=new int*[10];
for (int i=0;i<10;++i) X[i]=new int[10];

但这有点反驳了C ++数组只是指针(1-dim数组肯定是指针)的想法。

1 个答案:

答案 0 :(得分:1)

不。引擎盖下的int[N][M]是一个连续的内存块(其中额外的维度是扁平的),带有一些语法糖,使编译器可以进行数学访问。

int **(实际上int *[N])是一个完全不同的野兽,因为它使用了一个额外的后续间接,允许每一行驻留在别处;哎呀,你甚至可能有NULL行或不同长度的行。

OTOH如果你有一个“真正的”多维数组并需要一个int **,你可以通过只创建“指针索引”来弥补差距,并使其指向原始数组。

int *a[10];
for(int i=0; i<10; ++i) 
    a[i]=arr[i];