2012-06-05 127 views
3

當一個多維陣列被傳遞給功能時,爲什麼C++要求所有但第一尺寸到在參數裏指定C++,多維數組

+0

因爲函數不能接受數組參數。 –

回答

0

例如int a[n][m]是一個數組,其類型爲int陣列長度的m。換句話說,數組的長度是其類型的一部分。至於所有的函數參數,編譯器需要知道它的類型。

在C++中沒有多維數組。它只是一個看起來像它的語法。在int a[4]int b[5] a和b是不同的類型。

+0

你有沒有理由更具體一點?我理解了它的一部分。 – user1247347

11

問一個更好的方法是詢問爲什麼C++不需要指定第一維。

原因是,對於所有數組,您不能按值傳遞數組給函數。如果你試圖聲明一個帶數組的函數,編譯器會將聲明調整爲相應的指針類型。

這意味着您指定的維度並不重要,因爲維度不構成函數簽名的一部分。

例如,這些都聲明完全相同的功能。

void f(int *p); 
void f(int p[]); 
void f(int p[10]); 
void f(int p[100]); 

當瀏覽陣列中的功能指向p,該copmiler需要的唯一信息是所述數組元素的這種情況下的尺寸,即sizeof(int)

更復雜的數組完全相同。這些都是相同的:

void g(Type p[][10][20]); 
void g(Type (*p)[10][20]); 
void g(Type p[10][10][20]); 
void g(Type p[99][10][20]); 

但是這些都是不同:

void g(Type p[][5][20]); 

因爲調整的比外陣列尺寸的任何其他的尺寸影響的(至少)外陣列的大小元素意味着用於導航數組的指針算術將不得不改變。

0

簡而言之:編譯器不需要因爲數組會衰減到一個指針。但編譯器需要額外的維度來計算內存中的正確位置。

首先,您需要知道C/C++中的數組是內存中的線性連續對象。這非常有效。

因爲C/C++中的數組是一個線性連續的內存對象,數組將衰減爲一個指針。複製完整的數組將浪費時間和內存,並且不需要。指針是通過數組需要的任何東西。要通過數組,您可以使用增量運算符或任何計算結果爲數組中的有效地址。您可以在數組本身中設置一個分隔符,即'\ 0'或將該長度傳遞給函數seperatley,以告訴您的代碼數組的末尾在哪裏。

對於多維數組,事情有點複雜。多維數組仍然只是內存中的線性連續對象!但是,編譯器大概需要額外維度信息計算糾正在內存中的位置,設想以下:

char array[10][10]; // 0 - 99 

正確:

// formal argument tells your compiler, that each column is 10 elements long 
funca(int array[10][10]) { 
    // access to element 25 (2 * 10 + 4, the 10 is known through your formal argument, remember that an array is null based) 
    array[2][3] = 'x'; 
} 

錯誤:

// formal argument tells your compiler, that ech colum is 5 elements long 
funcb(int array[10][5]) { 
    // access to element 15 (2 * 5 * + 4, the 5 is known through your formal argument, remember that an array is null based) 
    array[2][3] = 'x'; 
} 

一注意(或警告): Java中的數組,特殊(不規則)多維數組完全不同噸。