在C ++中我想初始化一个双矩阵(二维双数组),就像我通常没有像这样的指针一样:
double data[4][4] = {
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
但是,由于我想返回并将其传递给函数,我需要它作为double**
指针。所以,基本上我需要以一种很好的方式初始化数据(如上所述),但之后我需要将指针保存到2D数组,而不会在函数退出时丢失数据。
对此有何帮助? : - )
答案 0 :(得分: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);
}
顺便说一句,如果你以这种方式将它传递给一个函数,你将“分配”而不是“初始化”。
答案 1 :(得分: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)
{
// ...
}
这样可以避免处理数组到指针的衰减,并使代码更易读。恕我直言。
答案 2 :(得分: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])
{
...
...
}
这会将数组作为参考传递,而不需要使用指针。
希望这会有所帮助。
答案 3 :(得分:3)
double (*)[4]
与double **
只需在内存中勾勒出双打的布局,你就应该理解为什么你不能互换使用它们。
答案 4 :(得分:1)
以这种方式初始化临时变量,然后将其复制到动态分配的内存中。
答案 5 :(得分: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;
}
答案 6 :(得分:0)
迟到了,但是.... c++ 旨在与 c++ stl 一起使用。 (至少根据 Bjarne Stroustrup 的说法,如果您在 C++ 中使用原始指针,那么您就做错了。)
#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://stackoverflow.com/a/12616826/1031191)
有什么好处? 它可以很好地与标准算法配合使用,知道它的大小、相同的性能等。 参考:std::array vs array performance