2013-10-26 66 views
1

我试图编译下面的代码调用上新:如何多维数组

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的正确方法是什么?为什么我不能将它作为**归还?

+1

一个const-指向一个const布尔的const指针的指针。只是这些日子不常见到这种情况。 – WhozCraig

回答

2
bool retval[4][4] = new bool[4][4]; 

返回类型是一个指针,你必须将它分配给指针变量而不是数组变量。

 My understanding was that a [][] array was the same thing as a **. Is this not true? Why can't I return it as a **?

不,因为array decay isn't recursive。当你做new bool[4][4]时,你会得到bool (*) [4]作为返回的指针(这里只有第一级已经衰减)。

什么是调用新的二维数组的正确方法?

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

推荐阅读:How do I use arrays in C++?

0

这里需要使用双指针:

bool** retval = new bool*[4]; 
for(int i=0; i<4; ++i) 
{ 
    retval[i] = new bool[4]; 
    for(int j=0; j<4; ++j) 
    { 
     retval[i][j] = input[i][j]; 
    } 
} 

注意:您可以只使用一个多维向量这里也