2011-11-04 113 views
1

什麼聲明多維數組這樣的區別:此聲明多維數組:指針或數組Definiton

int* a[5];

int a[5][5];

或?

哪一個更好用?謝謝。

+0

: 而當列的數目是未知的,在2D陣列聲明時間或列的數目可以在運行時改變或僅僅一個想要創建非矩形(鋸齒狀)陣列這樣這個int * a[ROWS]符號用於你可能會發現http://cdecl.org/用於'解碼'複雜的C聲明。 – nimrodm

+1

[Is int * array \ [32 \]指向32個int的數組或指向int的32個指針的數組的可能重複?這是否重要?](http://stackoverflow.com/questions/1371898/is-int-array32-a-pointer-to-an-array-of-32-ints-or-an-array-of-32-指針-t) –

+0

相關問題:http://stackoverflow.com/q/7586702/51831 – jpalecek

回答

1

這兩個可能被用來聲明2維數組。

在第一種情況下,25個int元素被分配在內存中的連續區域中。 在這種情況下,表達式a[i][j]被編譯器翻譯爲*(a + i*5 + j)

第二個分配5個指針到int。您可以通過分配int的向量並使這些指針指向這些向量來使其作爲二維數組工作。 在這種情況下,a[i][j]表示獲得指向a[i]指向的指針,然後查找該向量中的第5個元素。即a[i][j]被翻譯爲*(a[i] + j)

請注意,在第二種情況下,行不必具有相同的長度。

0

int a[5][5];說,編譯器應該分配足夠的內存來存儲25個整數,並把它當作一個二維數組稱爲a

int* a[5];表示編譯器應該分配足夠的內存來存儲指向整數的5個指針,並將其視爲指向數組的指針a。要實際使用它作爲一個二維數組,你將不得不分配更多的內存並初始化這些指針來指向它。例如:

int * a[5]; 
for(int i = 0; i < 5; i++){ a[i] = malloc(sizeof(int) * 5); } 

不知道您的要求,很難說哪一個更適合您。第二個允許你有效地交換兩行,通常更靈活,但需要更多的代碼來分配和釋放數據結構。

0

哪個更好的蘋果或橙子? 此符號int a[ROWS][COLS]用於創建尺寸在聲明時已知的矩形2D陣列。

1 2 3 4 
4 6 
7 1 1 1 5 6 7 
9