新的int[M][N]的类型是什么?

3
根据 typeid(array).name(),在G++ 4.8.4中它是 PAN_i。我知道P表示指针,i表示int,但A是什么类型,为什么只有第二维- N,而没有第一维 - M
auto array = new int[M][N]中的auto应该替换成什么?
有没有一种方法将array分配给int **
另一个问题是M和N必须是编译时常量。如果不是,则我想我的唯一选择是动态C ++ 03 2D数组

知道编译器会有所帮助,因为 name 返回的字符串是实现定义的,请参见此处:http://en.cppreference.com/w/cpp/types/type_info/name。 - skypjack
编译器是GCC 4.8.2。在MinGW 4.9.2中也是一样的。 - Slazer
@barakmanos 我认为这很好。只有N必须是编译时常量。 - juanchopanza
我将此问题标记为可能重复的 https://dev59.com/qXVD5IYBdhLWcg3wHnwX 。此外,你在一个标题不涵盖所有内容的问题中问了三个不同的事情。 - skypjack
据我记得,你需要为第一个维度分配空间(int** array = new int*[M]),然后对于数组中的每个元素,再分配第二个维度的空间(array[i] = new int[N])。 - barak manos
显示剩余10条评论
1个回答

5
新的 int[M][N] 的类型是指向长度为 N 的 int 数组的指针1,或者说
int (*)[N]

如果你想到一个new[]表达式是如何工作的,它会初始化一个在运行时指定长度的数组,并返回该数组第一个元素的指针。因此,类型为
new T[M]

T*是指向int[N]的指针,在二维情况下,您可以将T视为int[N]。因此,数组的每个元素都是一个数组本身,并且new返回指向其第一个元素的指针。这可能是更清晰的表达方式:

typedef int ArrayN[N];

auto array = new ArrayN[M];

1 在C++中,C风格的数组的维度必须是编译时常量,这意味着N必须是一个常量表达式。


您可能还想建议使用 typedef int MyArray_t[M][N],并在这种情况下推荐使用 vector<vector<int>> - barak manos
我必须使用 bool** 来表示这个结构。 - Slazer
这个问题已经回答了。我会单独提出其他问题。 - Slazer
1
@barakmanos,我添加了一个typedef的示例,但只是用1D数组,因为这是使用new表达式创建的数组元素类型。 - juanchopanza
@Slazer,维度“M”是动态分配数组的长度。该数组包含C风格的数组。在C++中,这些数组需要在编译时知道大小。 - juanchopanza
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接