C ++多维数组初始化

时间:2010-08-24 07:14:06

标签: 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
};

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

对此有何帮助? : - )

7 个答案:

答案 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