鉴于以下代码:
double** vr(new double*[nx]);
vr[i]=new double[ny];
for(int i=0;i<nx;++i) { //Loop 200times
for(int j=0;j<ny;++j) { //Loop 200times
vr[i][j]=double(i*i*i*j*c1);
}
}
vr[i][j] = double(i * i * i * j * c1);
为什么不需要使用*
来解析值,例如*(vr[i][j])
。
这只是一个地址不是吗?
答案 0 :(得分:1)
下标运算符([i]
)进行解除引用。它说要转移i
&#34;细胞&#34;并获得位于那里的对象。
答案 1 :(得分:1)
下标
operator []
的解释方式是E1[E2]
与*((E1)+(E2))
([expr.sub])相同。因为转换 适用于+
的规则,如果E1
是数组且E2
是整数,那么E1[E2]
是指E2-th
的{{1}}成员。因此,尽管如此 不对称外观,下标是可交换操作。 - 结束说明]
因此,E1
,下标运算符与使用operator[]
(一元)进行间接运算相同。
operator*
答案 2 :(得分:1)
vr[i][j]
是double
而不是地址。
基本上,如果p
的类型为T*
,则p[i]
表示*(p+i)
且类型为T
,其中T
可以是vr
类型。
在您的情况下,double**
为vr[i]
,因此double*
为vr[i][j]
且double
为vr[i]
。
答案 3 :(得分:1)
当您执行vr[i]
时,您已经取消引用,因为*(vr + i)
相当于vr[i][j]
。这意味着*(*(vr + i) + j)
是双重解除引用,相当于RIsGreat
ILoveDataAnalysis
...
...
。
有关详细信息,请参阅pointer arithmetic。