1

我目前正在浏览一些旧的大学 C++ 代码片段。那时,另一个类中的一个被分配使用双指针和二维数组来做一个矩阵类。幸运的是(或事后看来不幸)我从来没有机会学习这样的东西。我们毕业时我借用了他们的代码以备将来审查。如果有人可以向我解释这个片段中到底发生了什么:

  //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]?

4

2 回答 2

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 个指针组成的数组,而这个指针指向一个由一个 double 组成的数组。

现在回答你的问题

  1. 它不是指针,因为在您的第二维中,您最终要存储双精度数,而不是指针。
  2. 它被分配给_coef[0],因为它是二维数组的第一行,也是唯一的一行。
于 2012-12-02T16:49:32.057 回答
1

正如您所说,前两行将值分配1_nrows_ncols

double*以下行动态分配(指向)的数组doubledouble*分配的对象数是_nrows1在您的情况下)。将该语法视为类似于定义一个正常的自动数组 ,double* array[1]其中元素的数量为1。然后_coef是指向这些指针中的第一个的double指针。我将用图表表示内存表示:

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

所以现在你已经在内存_nrowsdouble*排队了。_coef[0]指第一个double*。一个新的动态分配的数组,这次是doubles,被创建为 size _ncols。指向这些doubles 中的第一个的指针被分配给_coef[0]。也就是说,第double*一个动态分配数组中的第一个现在指向double第二个动态分配数组中的第一个。

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

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

_nrows = 1
_ncols = 1
_coef  ---> _coef[0] ---> _coef[0][0] = 0
于 2012-12-02T16:48:18.577 回答