我正在尝试编译以下代码:
bool **copyBools( bool const * const * const input )
{
bool retval[4][4] = new bool[4][4];
for( int i=0; i<4; ++i )
{
for( int j=0; j<4; ++j )
{
retval[i][j] = input[i][j];
}
}
return retval;
}
但是,它不会编译并给出这些错误。第一个错误bool retval
在行上,第二个错误return
在行上:
error: array must be initialized with a brace-enclosed initializer
error: cannot convert ‘bool (*)[4]’ to ‘bool**’
我的理解是[][]
数组与数组是同一回事**
。这不是真的吗 此代码有什么问题?二维数组调用new的正确方法是什么?为什么我不能将其作为**
?
bool retval[4][4] = new bool[4][4];
返回类型是一个指针,您必须将其分配给一个指针变量而不是数组变量。
我的理解是[] []数组与**是同一回事。这不是真的吗 为什么我不能将其返回为**?
不,因为数组衰减不是递归的。当您这样做时new bool[4][4]
,您将获得bool (*) [4]
作为返回的指针(此处只有第一级衰减)。
二维数组调用new的正确方法是什么?
这个
bool (*retval) [4] = new bool[4][4];
应该管用。每个元素都像往常一样被访问retval[i][j]
,只是retval
对于不了解情况的人来说有点奇怪;它是一个指向四个布尔数组的指针。但是,对于下面的替代方法(两个尺寸都丢失了),它更安全,因为编译器可以检查长度,因为它是类型的一部分。但是,第二维也丢失了此方法。如果要保留两个尺寸,请使用std::array<std::array<bool, 4>, 4>
。此std::array
方法和方法中的警告是,仅当第一维未知时才可以使用它们,而所有其余维在编译时都是已知的。这是用于声明指向数组的指针。即使在编译时未知所有尺寸,也可以使用以下方法。
另一种选择是使用一个指针数组,并用一个布尔数组浸渍该数组中的每个指针。
bool** ptrs = new bool*[4];
for (size_t i = 0; i < 4; ++i)
ptrs[i] = new bool[4];
这使您可以返回bool**
。在这里,它new bool*[4]
也在第一级衰减并返回一个bool**
指针。但是,如果两个维度都不知道,则建议使用(惯用的)方法std::vector
。
推荐读物: 如何在C ++中使用数组?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句