我目前正在浏览一些旧的大学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]?
答案 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指针的数组,这个指针指向一个双精度数组。
现在回答你的问题
_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}}