динамический 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