C ++中的矩阵类:一种解释

时间:2012-12-02 16:41:30

标签: c++ arrays pointers multidimensional-array matrix

我目前正在浏览一些旧的大学c ++代码片段。那时,另一个类被指派使用双指针和2D数组进行矩阵类。幸运的是(或事后不幸)我从来没有机会学到这样的东西。当我们毕业以供将来审查时,我借用了他们的代码。如果有人能够向我解释这个片段到底发生了什么:

  //This is a constructor of a 1x1 matrix
  signal::signal(){
     _nrows = 1;
     _ncols = 1;
     _coef = new double*[_nrows];
     _coef[0] = new double[_ncols];
     _coef[0][0] = 0.0;
  }

只是一个旁注,_coef是双重类型的**。

根据我的理解,_nrows和_ncols的值为1(表示其大小)。然后,代码动态地在堆中创建一个double * out,其元素等于_nrows;问题是,我不知道接下来会发生什么。为什么对应于_ncols的数组不是指针?为什么分配_coef [0]?

2 个答案:

答案 0 :(得分:2)

在内存中,二维数组(n,m)或多或少看起来像

_coef -> | _coef[0] -> {1, 2, 3, ..., m}
         | _coef[1] -> {1, 2, 3, ..., m}
         | _coef[2] -> {1, 2, 3, ..., m}
         | ...
         | _coef[n] -> {1, 2, 3, ..., m}

_coef指向一个n指针数组。并且每个指针都指向m双精度数组。

所以,在你的情况下_coef指向一个1指针的数组,这个指针指向一个双精度数组。

现在回答你的问题

  1. 它不是指针,因为在你的第二个维度中,你最终想要存储双打,而不是指针。
  2. 它被分配给_coef[0],因为它是您的二维数组的第一个也是唯一的一行。

答案 1 :(得分:1)

正如您所说,前两行为每个1_nrows分配值_ncols

以下行动态分配double*数组(指向double的数组)。分配的double*个对象的数量为_nrows(在您的情况下为1)。可以认为该语法与定义普通自动数组double* array[1]类似,其中元素的数量为1。然后_coef是指向第一个double指针的指针。我将以图解方式表示内存表示:

_nrows = 1
_ncols = 1
_coef  ---> _coef[0] ---> Currently points nowhere in particular

所以现在你的_nrows数量double*排在记忆中。 _coef[0]指的是double*中的第一个double。这个_ncols s的新动态分配数组是由大小double创建的。指向这些_coef[0]中的第一个的指针被分配给double*。也就是说,第一个动态分配的数组中的第一个double现在指向第二个动态分配的数组中的第一个_nrows = 1 _ncols = 1 _coef ---> _coef[0] ---> _coef[0][0]

_coef[0][0] = 0.0

然后double将第二个动态分配的数组中的第一个0设置为double。由于它只是 1,因为两个动态分配的数组的大小都是double,所以您已将所有_nrows = 1 _ncols = 1 _coef ---> _coef[0] ---> _coef[0][0] = 0 初始化为0。

{{1}}