C ++:为什么我不需要取消引用来初始化动态数组?

时间:2018-05-02 00:32:36

标签: c++

鉴于以下代码:

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])

这只是一个地址不是吗?

4 个答案:

答案 0 :(得分:1)

下标运算符([i])进行解除引用。它说要转移i&#34;细胞&#34;并获得位于那里的对象。

答案 1 :(得分:1)

来自dcl.array/6

  

下标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]doublevr[i]

答案 3 :(得分:1)

当您执行vr[i]时,您已经取消引用,因为*(vr + i)相当于vr[i][j]。这意味着*(*(vr + i) + j)是双重解除引用,相当于RIsGreat ILoveDataAnalysis ... ...

有关详细信息,请参阅pointer arithmetic