C++多维数组初始化

Fel*_*lix 8 c++ pointers initialization multidimensional-array

在C++中我想初始化一个双矩阵(二维双数组),就像我通常没有像这样的指针:

    double data[4][4] = {
    1,0,0,0,
    0,1,0,0,
    0,0,1,0,
    0,0,0,1
};
Run Code Online (Sandbox Code Playgroud)

但是,由于我想返回并将其传递给函数,我需要它作为double**指针.所以,基本上我需要以一种很好的方式初始化数据(如上所述),但之后我需要将指针保存到2D数组,而不会在函数退出时丢失数据.

对此有何帮助?:-)

Chu*_*dad 10

除非你特别关注指针,否则我更喜欢这里的参考

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);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你以这种方式将它传递给一个函数,你将"分配"而不是"初始化".


fre*_*low 5

你的所有矩阵都是4x4吗?然后我只需要定义一个带有double[4][4]成员的类,并传递该类的对象:

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

void function(const Matrix& matrix)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您需要各种维度的矩阵,但它们在编译时已知,请使用模板:

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

template <size_t n>
void function(const Matrix<n,n>& matrix)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这样可以避免处理数组到指针的衰减,并使代码更具可读性.


小智 5

首先,二维数组的声明不正确。它需要完成以下步骤:

double data[4][4] = {  
        {1.0,0,0,0},  
        {0,1,0,0},  
        {0,0,1,0},  
        {0,0,0,1}  
    };
Run Code Online (Sandbox Code Playgroud)

其次,要在函数中传递它,您可以像

show(data);
Run Code Online (Sandbox Code Playgroud)

在函数声明中,您需要将参数作为数组给出,并给出除第一个维度外的所有维度。所以声明看起来像:

void show(double arr[][4])
{
   ...
   ...
}
Run Code Online (Sandbox Code Playgroud)

这将数组作为引用传递,而无需使用指针。

希望这会有所帮助。