Разница в точности такая, как показывает код
int* p = new int[n];
выделяет int
, но
int** p = new int*[n];
выделяет int*
.
Вы можете выделить что угодно (более или менее). Если вы выделяете T
, то вы получаете указатель на T
, т.е. T*
.
Но в указателях нет ничего особенного, они тоже могут быть выделены. Итак, если вы выделяете T*
(указатель на T
), то вы получаете указатель на указатель на T
(т.е. T**
).
Размещение указателей - это первый шаг к выделение 2D-массива. 2D-массив - это просто массив одномерных массивов. Указатели - это строки в 2D-массиве (если хотите), но столбцы все еще необходимо выделить.
int** array2d = new int*[num_rows]; // allocate the rows
for (int i = 0; i < num_rows; ++i)
array2d[i] = new int[num_cols]; // allocate the columns for row i
После выполнения этого кода array2d
- это динамически выделяемый 2D-массив с num_rows
строками и num_cols
столбцы.