【问题标题】:Matrix Class in C++: An ExplanationC++ 中的矩阵类:解释
【发布时间】:2025-12-27 19:40:07
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    在内存中,一个二维数组 (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],因为它是二维数组的第一行,也是唯一的一行。

    【讨论】:

      【解决方案2】:

      如您所说,前两行将值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* 中的第一个。创建一个大小为_ncols 的新动态分配数组,这次为doubles。指向第一个doubles 的指针分配给_coef[0]。也就是说,第一个动态分配数组中的第一个double* 现在指向第二个动态分配数组中的第一个double

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

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

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

      【讨论】:

      • 这也很有帮助!