2013-04-12 2 views
1

У меня был вопрос в моем назначении, где я использовал следующий способ определения 2D массива:Двумерные массивы

// 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 

matrix1 является array of pointers, что указывает на междунар. int массивы разлагаются до int*. Поэтому у вас есть синтаксис выше. Чтобы лучше понять это, подумайте о том, как вы имеете дело с динамическими массивами 1D следующим образом:

int* A = new int[SIZE_OF_ARRAY]; 

здесь, A имеет типа int*, он функционально похож на статический массив A[SIZE_OF_ARRAY] если SIZE_OF_ARRAY постоянное время компиляции. Теперь предположим, что у вас есть еще один статический массив B[ROWS][COLS], с ROWS и COLS константами времени компиляции, однако, если эти значения размера массива не являются константами во время компиляции, вам необходимо распределить память динамически, поэтому для 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.

Вы можете просмотреть расположение памяти 2D массивов здесь: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html

Смежные вопросы