2013-04-12 188 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