2013-04-12 82 views
1

我在我分配的問題在那裏我用下面的方式來定義一個二維數組:二維數組

// Allocating two two-dimensional matrix 
int** matrix1 = new int*[rows]; 
for(int i=0; i!=rows; ++i) 
matrix1[i] = new int[cols]; 
int** matrix2 = new int*[rows]; 
for(int i=0; i!=rows; ++i) 
matrix2[i] = new int[cols]; 

我發現它真的很難理解這種方法,甚至在完成課程後,我發現這太混亂。我在學期期間通過在互聯網上找到更簡單的方式來管理,但我真的很想知道這裏發生了什麼。

有人可以用盡可能簡單的話來解釋嗎?謝謝!

回答

2

我認爲這是如何結合在一起的這個圖像解釋相當不錯。 array是你的矩陣之一。

enter image description here

matrix1指向指針(行)的陣列,其中,每個指針指向整數(列)的陣列。

1

動態2D陣列基本上是一個指針數組,語法明智的,它是:

int** matrix1; //for integer 2D array 

matrix1array of pointers指向爲int。 int數組衰減到int*。因此,你有上面的語法。爲了更好地理解它,想想你是如何處理動態一維數組如下:

int* A = new int[SIZE_OF_ARRAY]; 

這裏,Aint*型的,它在功能上類似於靜態數組A[SIZE_OF_ARRAY]如果SIZE_OF_ARRAY是一個編譯時間常數。現在,假設您有另一個靜態數組B[ROWS][COLS],ROWSCOLS編譯時間常量,但是,如果這些數組大小值在編譯時不是常量,則需要動態分配內存,因此對於B,您必須執行與你爲matrix1

int **B; 

分配內存,你必須先分配how many pointers the array of pointers store,同時,還需要分配內存for how many int elements each pointer points to,所以你需要嵌套用於此目的的循環。

在C++中,最好用vector<vector<int>>來代替int** matrix1

您可以查看這裏二維數組的內存佈局:http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html