C++中的矩阵类:解释

Matrix Class in C++: An Explanation

本文关键字:解释 C++      更新时间:2023-10-16

我目前正在浏览一些旧的大学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(表示它们的大小)。然后,代码在堆中动态创建一个双精度* out,元素等于 _nrows;问题是,我不知道接下来会发生什么。为什么对应于_ncols的数组不是指针?为什么分配_coef[0]?

在内存中,二维数组 (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. 它不是一个指针,因为在第二个维度中,你最终想要存储双精度,而不是指针。
  2. 它被分配给_coef[0],因为它是二维数组的第一行,也是唯一一行。

正如您所说,前两行将值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*中的第一个。一个新的动态分配数组,这次是doubles,创建大小为_ncols。指向其中第一个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初始化为0。

_nrows = 1
_ncols = 1
_coef  ---> _coef[0] ---> _coef[0][0] = 0