2010-08-24 115 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; 
}