我正在研究一个项目,我应该存储常量多维数组。我想用一个指向多维数组的指针来做。但是,我不能成功。我写这个代码但是它没有编译。
int darray[1][2];
int darray2[2][3];
int (*p)[1][2];
p= new int[2];
p[0] = darray;
p[1] = darray2;
答案 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;
情况)的分配。