Как распределяется память Dynami c в двумерном массиве? - PullRequest
1 голос
/ 03 августа 2020

Пытался разобраться в распределении памяти в куче, но запутался
В чем их разница:

int** p=new int*[n];

vs

int*p=new int[n];

2) первая строка кода int ** p = new int * [n], это сильно сбивает с толку, что возвращает int * [n] и возвращает new int * [n].

Ответы [ 4 ]

3 голосов
/ 03 августа 2020

Вторая строка кода выделяет массив int размером n, с этим нет проблем.

Первая строка не выделяет 2D-массив . Он просто выделяет массив указателей. Если можно использовать для имитации c 2D-массива с массивом указателей на массивы :

int **p = new int*[n];
for (int i=0; i<n; i++) {
    p[i] = new int[m];
}

Тогда он выглядит как 2D-массив размером n * m в смысл, что вы можете использовать p[i][j], за исключением того, что строки не являются смежными.

Но помните: при кодировании на C ++ всегда отдавайте предпочтение стандартным контейнерам, а не ручному выделению.

3 голосов
/ 03 августа 2020

Разница в точности такая, как показывает код

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 столбцы.

2 голосов
/ 03 августа 2020

Прежде всего - это не двумерный массив. Это массив указателей.

int** p=new int*[n];

, тогда вам нужно выделить место для каждой строки, перебирая этот массив.

Чтобы создать двумерный массив, вам нужен на:

int (*x)[n] = new int[n][n]; 
0 голосов
/ 03 августа 2020

2D-массив может быть динамически размещен в C с помощью одного указателя. Это означает, что блок памяти размером row column dataTypeSize выделяется с использованием mallo c, а арифметические значения указателя c могут использоваться для доступа к элементам матрицы.

...