當一個多維陣列被傳遞給功能時,爲什麼C++要求所有但第一尺寸到在參數裏指定C++,多維數組
C++,多維數組
回答
例如int a[n][m]
是一個數組,其類型爲int
陣列長度的m
。換句話說,數組的長度是其類型的一部分。至於所有的函數參數,編譯器需要知道它的類型。
在C++中沒有多維數組。它只是一個看起來像它的語法。在int a[4]
和int b[5]
a和b是不同的類型。
你有沒有理由更具體一點?我理解了它的一部分。 – user1247347
問一個更好的方法是詢問爲什麼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]);
因爲調整的比外陣列尺寸的任何其他的尺寸影響的(至少)外陣列的大小元素意味着用於導航數組的指針算術將不得不改變。
如果引用靜態分配,這很簡單。 因爲內存塊是連續的,這意味着內存單元是一個接一個的,編譯器知道下一個單元在內存中的位置。
對於存儲陣列的一維看起來是這樣的:
http://cplusplus.com/doc/tutorial/arrays/arrays3.gif
對於存儲陣列二維像這樣:
簡而言之:編譯器不需要因爲數組會衰減到一個指針。但編譯器需要額外的維度來計算內存中的正確位置。
首先,您需要知道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中的數組,特殊(不規則)多維數組完全不同噸。
- 1. 多維數組(C++)
- 2. C++多維數組
- 3. C#多維數組
- 4. 多維數組c
- 5. C#多維數組在C + +?
- 6. C#多維數組迭代
- 7. c#session多維數組
- 8. c#多維數組驗證
- 9. C++排序多維數組
- 10. Sum多維數組C#
- 11. C++中的多維數組
- 12. 傳遞多維數組C++
- 13. objective-c多維數組
- 14. C++中的多維數組?
- 15. C++多維數組struct
- 16. C++中的多維數組
- 17. 多維關聯數組C#
- 18. 熄燈C#多維數組
- 19. C++多維動態數組
- 20. 多維數組的C#行
- 21. C中的多維數組
- 22. C,多維數組練習
- 23. 將C多維數組
- 24. 返回多維數組c
- 25. c使用多維數組
- 26. 列在多維數組C#
- 27. 多維數組索引中的多維數組C++
- 28. 靜態多維數組(C/C++)
- 29. 在C/C++中傳遞多維數組
- 30. C多維字符串數組在C
因爲函數不能接受數組參數。 –