2014-07-08 45 views
2

有沒有簡單的方法將int[n][n]類型的實例轉換爲int**? 例如,代碼如何在C++中將int [] []轉換爲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-暗淡陣列當然是)。

+0

當前函數「foo」沒有辦法知道該數組是10x10 - 我認爲這是行嗎? – Jimmy

+0

'int [100]'和'int [10] [10]'不是一回事。 –

+1

這對你有幫助嗎? http://stackoverflow.com/questions/1584100/converting-multidimensional-arrays-to-pointers-in-c –

回答

1

沒有。引擎蓋下的一個int[N][M]是一些連續的內存塊(其中額外的維度被展平)和一些語法糖,以使編譯器完成數學操作來訪問元素。

int **(實際上是int *[N])是一個完全不同的野獸,因爲它使用一個額外的後續間接,允許每一行都駐留在其他地方;哎呀,你甚至可能有NULL行或不同長度的行。

OTOH如果你有一個「真正的」多維數組,並且需要一個int **,你可以通過創建只有「指針索引」並使它指向原始數組的內部來彌補差距。

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