如何在二维数组中分配动态内存?

How is dynamic memory allocated in two dimensional array?

试图了解堆中的分配内存但感到困惑
他们有什么区别:

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

vs

int*p=new int[n];

2) 第一行代码 int** p=new int*[n] 这让很多人感到困惑 int*[n] return 和 new int*[n] return.

可以使用单个指针在 C 中动态分配二维数组。这意味着大小为 rowcolumndataTypeSize 的内存块是使用 malloc 分配的,指针算法可用于访问矩阵元素。

第二行代码分配了一个n大小的int数组,没问题。

第一行没有分配二维数组。它只是分配一个指针数组。 If 可用于模拟具有 数组指针的二维数组 :

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

它看起来像一个大小为 n*m 的二维数组,从某种意义上说,您可以使用 p[i][j],只是行不连续。

但请记住:在使用 C++ 编码时,始终首选标准容器而不是手动分配。

区别如代码所示

int* p = new int[n];

分配 int,但

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

分配 int*.

您可以分配任何东西(或多或少)。如果你分配 T 那么你得到的是指向 T 的指针,即 T*.

但是指针没有什么特别的,它们也可以被分配。因此,如果您分配 T*(指向 T 的指针),那么您返回的是指向 T(即 T**)的指针。

分配指针是分配二维数组的第一步。二维数组只是一维数组的数组。指针是二维数组中的行(如果您愿意),但仍需要分配列。

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 是一个具有 num_rows 行和 num_cols 列的动态分配的二维数组。

首先 - 它不是二维数组。它是一个指针数组。

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

那么您需要通过遍历此数组为每一行分配 space。

要创建二维数组,您需要:

int (*x)[n] = new int[n][n];