c – 了解具有动态内存分配的2D数组

有人可以帮我理解这段代码中的最后一行吗?我不明白如何动态分配2D数组.据我所知,在第6行,它创建了一个名为’a’的指针,并将其指向由’c’定义的大小为5的整数数组.

我不明白的是,“new int”语句如何与抛入等式的r一起工作.提前致谢.

#include <iostream>
const int c = 5; //num of columns

 int main () {
   int r = 5;
   int (*a)[c];
   a = new int[r][c]; // allocate array
}

最佳答案 如果你有一个类型T并且要分配一个大小为N的数组,那么这个表达式

new T[N]

返回已分配数组的第一个元素的类型T *的地址.

所以你应该写

T *a = new T[N]; 

例如,如果T等于int类型

typedef int T;

要么

using T = int;

然后可以写上面的分配

int *a = new int[N];

数组元素的大小等于sizeof(int),通常是4个字节.

现在让我们假设你要分配一个int [M]类型的元素数组,其中M是一个常量整数表达式.

你可以写

typedef int T[M];

要么

using T = int[M];

T *a = new T[N];

所以你分配了一个N个元素的数组,其中每个元素的大小为sizeof(int [M],指针a指向数组的第一个元素.

因为T等于tp int [M]你可以写

int ( *a )[M] = new int [N][M]; 

也就是说,这个语句分配一个N [int]类型元素的数组,而指针a获取分配数组的第一个元素的地址.

回到你的程序示例

int r = 5
   int(* a)[c];
   a = new int [r] [c];

你可以用以下方式重写它

typedef int T[c];

要么

using T = int[c];

T *a = new T[r];

也就是说,这个语句分配一个int [c]类型的r元素(对象)数组,并且是指向已分配数组的第一个元素的指针.

点赞