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)
顺便说一句,如果你以这种方式将它传递给一个函数,你将"分配"而不是"初始化".
你的所有矩阵都是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)
这将数组作为引用传递,而无需使用指针。
希望这会有所帮助。