2013-10-26 59 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]; 
    } 
} 

注意:您可以只使用一個多維向量這裏也