在C++中,我想要像平常不使用指针一样初始化一个双精度矩阵(二维双精度数组),就像这样:
double data[4][4] = {
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
然而,由于我想将其返回并传递给函数,所以我需要它作为
double **
指针。因此,基本上我需要以良好的方式初始化数据(如上所述),但之后我需要保存指向2D数组的指针,在函数退出时不丢失数据。有什么帮助吗? :-)
在C++中,我想要像平常不使用指针一样初始化一个双精度矩阵(二维双精度数组),就像这样:
double data[4][4] = {
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
double **
指针。因此,基本上我需要以良好的方式初始化数据(如上所述),但之后我需要保存指向2D数组的指针,在函数退出时不丢失数据。除非你特别需要指针,否则我会更喜欢在这里使用引用
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);
}
顺便说一下,如果你以这种方式将其传递给函数,你将是在“分配”而不是“初始化”。
你所有的矩阵都是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)
{
// ...
}
首先,双维数组的声明不正确。需要按照以下方式进行声明:
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])
{
...
...
}
这个方法可以将数组作为引用传递,而不需要使用指针。
希望这能有所帮助。
double (*)[4]
与double **
非常不同。
只需勾画两者在内存中的布局,您就应该理解为什么不能互换使用它们。
#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;
}
以这种方式初始化临时变量,然后将其复制到动态分配的内存中。
#include <array> // on top
// ..
std::array<std::array<int, 4>, 4> data {{
{1,0,0,0},
{0,1,0,0},
{0,0,1,0},
{0,0,0,1}
}};
// access it normally
data[1][2] = 123;
std::cout << data[0][0]; // prints 1. (#include <iostream>)
// You can return std::array from a function as a normal return value, don't worry it is not going to be reallocated, or missing.
std::array<std::array<int, 4>, 4> give_me_data() {
std::array<std::array<int, 4>, 4> data {{
{1,0,0,0},
{0,1,0,0},
{0,0,1,0},
{0,0,0,1}
}};
return data;
}
(适用于Mac的XCode,gcc也支持它https://dev59.com/h2sy5IYBdhLWcg3w-i7h#12616826)
好处是什么? 它可以很好地与std算法配合使用,知道其大小,具有相同的性能等。 参考:std::array vs array performance
std::vector
。 - Barney Szabolcs
double**
,而不是double (*)[4]
?使用double (*)[4]
有什么问题吗? - CB Baileyerror: cannot convert 'double (*)[4]' to 'double**' in initialization
。 - fredoverflow