C ++:在指针中存储常量多维数组

时间:2012-04-01 14:05:07

标签: c++ multidimensional-array

我正在研究一个项目,我应该存储常量多维数组。我想用一个指向多维数组的指针来做。但是,我不能成功。我写这个代码但是它没有编译。

int darray[1][2];
    int darray2[2][3];
    int (*p)[1][2];
    p= new int[2];
    p[0] = darray;
    p[1] = darray2;

1 个答案:

答案 0 :(得分:2)

好吧,让我们逐行完成你的代码(好的,我会把前两行放在一起)

int darray[1][2];
int darray2[2][3];

好的,这就像你(可能)期望的那样定义了两个二维数组。请注意,正式地说,这些实际上是整数数组的数组。更确切地说,darray的类型为“每个2个整数的1个数组的数组”,而darray2的类型为“每个3个整数的2个数组的数组”

int (*p)[1][2];

这定义了一个指向int的二维数组的指针,或者指向这种数组数组的第一个元素的指针。也就是说,p的类型是“指向每个2个整数的1个数组的数组的指针”。

p= new int[2];

这里为两个整数分配空间(即整数的一维数组,长度为2),new返回指向该数组的第一个元素的指针,即指向int的指针。您尝试将指针指向int p,这是一个指向1个数组的数组的指针,每个数组包含2个int,如上所述。这会导致类型不匹配,不应编译。

目前还不完全清楚你想要什么,但考虑到你之后对p[0]p[1]进行了分配,并且假设返回值已分配给p,这是int (*)[1][2]类型的明显选择是p = new int[2][1][2];

p[0] = darray;

这再次不起作用,因为C ++中的数组不是第一类对象。也就是说,而不是像行所暗示的那样将darray的值赋给p[0](并且p[0]确实会有正确的类型)C ++的规则说数组{ {1}}被提升到指向其第一个元素的指针。也就是说,此代码实际尝试执行的操作是将指向darray(类型为darray)的第一个元素的指针指定给int (*)[2](类型为{ p[0]),当然失败了。在C ++中,数组根本不可分配。

int[1][2]

这也遇到了同样的问题,但请注意,即使数组是C ++中的第一类可分配对象,这仍然是类型不匹配,因为p[1] = darray2; 的类型为p[1],而int[1][2] 1}}类型为darray2

请注意,通过将数组包装到类C ++ 11实际上为此目的提供了一个名为int[2][3]的标准类模板,您可以解决大多数这些限制(除了最后一个):

std::array

通过更多的编程,您还可以通过手动复制部分数据来处理从较大到较小的数组(struct array12 { int data[1][2]; }; array12 darray; array12* p; p = new array12[2]; p[0] = darray; 情况)的分配。