2010-08-24 119 views
7

在C++我想初始化一個雙矩陣(2維雙陣列)等我通常沒有指針做像這樣:C++多維數組初始化

double data[4][4] = { 
    1,0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
}; 

但是,由於我想返回和將它傳遞給函數,我需要它作爲double**指針。所以,基本上我需要以一種很好的方式初始化數據(如上所述),但之後我需要將指針保存到2D數組而不會在函數退出時丟失數據。

任何幫助? :-)

+4

爲什麼你需要它作爲一個'雙**'? 'double(*)[4]'有什麼問題? – 2010-08-24 07:16:40

+0

這是C++。這可能是一個類,這個數組作爲一個成員,當你調用成員函數時會傳回一個引用嗎? – 2010-08-24 07:23:28

+0

[通過指針傳遞二維數組](http:// stackoverflow。com/questions/3515045/passing-two-dimensional-array-via-pointer)它是C,而不是C++,但它完全是同一個問題。 – 2010-08-24 07:28:21

回答

9

除非你是講究三分球,我寧願在這裏

void init(double (&r)[4][4]){ 
    // do assignment 
    r[0][0] = 1; 
} 

int main(){ 
    double data[4][4] = { 
     1.0,0,0, 
     0,1,0,0, 
     0,0,1,0, 
     0,0,0,1 
    }; 

    init(data); 
} 

參考順便說一句,如果你把它傳遞給函數在這種方式中,你將是「分配」,而不是「初始化」 。

+0

我認爲這個答案越來越暖和。這可能是我正在尋找的人! – Felix 2010-08-24 08:25:40

+0

通過用複製函數替換「init」,這可以優雅地模擬我的問題。謝謝! – Felix 2010-08-24 08:36:29

1

初始化這樣的臨時變量,然後將其複製到動態分配的內存。

3

double (*)[4]非常不同double **

只是勾畫你的雙打佈局在兩存儲,你應該明白你爲什麼不能互換使用它們。

+0

,因爲我不知道或不明白「double(*)[4]」,所以我不能勾畫它。這是什麼意思? – Felix 2010-08-24 07:51:45

+0

@Felix:這意味着「指向長度爲4的double數組」。 – 2010-08-24 07:54:50

5

是你的所有矩陣的4x4?那我就簡單地定義一個類與double[4][4]成員,並通過該類的對象周圍:

class Matrix 
{ 
    double m[4][4]; 
    // ... 
}; 

void function(const Matrix& matrix) 
{ 
    // ... 
} 

如果你需要不同尺寸的矩陣,但他們在編譯時是已知的,使用模板:

template <size_t n> 
class Matrix 
{ 
    double m[n][n]; 
    // ... 
}; 

template <size_t n> 
void function(const Matrix<n,n>& matrix) 
{ 
    // ... 
} 

這樣可以避免處理數組到指針的衰減,並使代碼更具可讀性。雙維陣列的

4

首先,聲明是不正確的。它需要做如下:

double data[4][4] = { 
     {1.0,0,0,0}, 
     {0,1,0,0}, 
     {0,0,1,0}, 
     {0,0,0,1} 
    }; 

其次,通過它的功能,你可以不喜歡它

show(data); 

在函數的聲明,你需要給參數與數組除第一個以外的所有維度。因此,聲明將是這樣的:

void show(double arr[][4]) 
{ 
    ... 
    ... 
} 

這傳遞數組作爲參考wihout你需要使用一個指針。

希望這有助於。

+0

謝謝!單線初始化是我一直在尋找的。 – 2015-10-21 04:34:35

0

這個怎麼樣(有指針,並做了你問什麼)

#include <iostream> 

using namespace std; 

int refer(double (*a)[4]) 
{ 
    cout<<"First value is "<<(*a)[0]; 
    (*a)[0] = 37; 
    cout<<"changed value is "<<(*a)[0]; 
} 

int main() 
{ 
    double data[4][4] = { 
    1.0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
    }; 
    refer(data); 
    return 0; 
}