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

C++ C++;:为什么在初始化动态数组时不需要取消引用?,c++,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); } } double**vr(新的double*[nx]); vr[i]=新的双精度[ny]; for(in

鉴于以下代码:

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

    }
}
double**vr(新的double*[nx]);
vr[i]=新的双精度[ny];
for(int i=0;i下标运算符(
[i]
)执行解引用。它表示在
i
“单元格”上移动并获取位于那里的对象。

下标运算符(
[i]
)执行解引用。它表示在
i
“单元格”上移动并获取位于那里的对象。

来自

下标
运算符[]
的解释方式为
E1[E2]
由于转换,与
*((E1)+(E2))
([expr.sub])相同 适用于
+
的规则,如果
E1
是数组而
E2
是整数,则
E1[E2]
E1
E2 th
成员。因此,尽管 在不对称的情况下,下标是一种交换操作。  — 尾注 ]

因此,下标运算符
运算符[]
的工作原理与使用
运算符*
(一元数)进行间接寻址的工作原理相同

int a[5] = {1, 2, 3, 4, 5}; // array
int* pa = a;                // pointer to a
std::cout <<  pa[2];        // (ans. 3) using subscript operator
std::cout << *(pa + 2);     // (ans. 3) using indirection, accessing A's 3rd element
inta[5]={1,2,3,4,5};//数组
int*pa=a;//指向a的指针
std::coutFrom

下标
运算符[]
的解释方式为
E1[E2]
由于转换,与
*((E1)+(E2))
([expr.sub])相同 适用于
+
的规则,如果
E1
是数组而
E2
是整数,则
E1[E2]
E1
E2 th
成员。因此,尽管 在不对称的情况下,下标是一种交换操作。  — 尾注 ]

因此,下标运算符
运算符[]
的工作原理与使用
运算符*
(一元数)进行间接寻址的工作原理相同

int a[5] = {1, 2, 3, 4, 5}; // array
int* pa = a;                // pointer to a
std::cout <<  pa[2];        // (ans. 3) using subscript operator
std::cout << *(pa + 2);     // (ans. 3) using indirection, accessing A's 3rd element
inta[5]={1,2,3,4,5};//数组
int*pa=a;//指向a的指针

std::cout
vr[i][j]
是一个
double
而不是一个地址

基本上,如果
p
属于
T*
类型,则
p[i]
表示
*(p+i)
,属于
T
类型,其中
T
可以是任何类型


在你的例子中,
vr
double**
,所以
vr[i]
double*
vr[i][j]
double
vr[i][j]
不是地址

基本上,如果
p
属于
T*
类型,则
p[i]
表示
*(p+i)
,属于
T
类型,其中
T
可以是任何类型


在你的例子中,
vr
double**
,因此
vr[i]
double*
vr[i][j]
double
,当你做
vr[i]
时,你已经在解除引用,因为
vr[i]
相当于
*(vr+i)
。这意味着
vr[i][j]
是双解引用,相当于
*(*(vr+i)+j)



请参阅以获取更多信息。

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



有关更多信息,请参阅。

这已经得到了很好的回答。数组索引和指针算法是用不同的语法表达的相同概念。您的问题不是初始化,而是赋值。我只是想问为什么它会取消引用?是否存在某种重载[]可能是指针类的运算符?答案差不多了。数组索引和指针算法是用不同语法表达的相同概念。你的问题不是初始化,而是赋值。我只是想问为什么它会取消引用?是否存在某种重载[]可能是指针类的运算符?我只是想问它为什么取消引用?可能是指针类有某种重载[]运算符吗?我只是想问它为什么取消引用?可能是指针类有某种重载[]运算符吗?我只是想问它为什么取消引用?是否有某种重载[]运算符可能是指针类的运算符?我只是想问它为什么取消引用?可能是指针类有某种重载[]运算符吗?我只是想问它为什么取消引用?是否有某种重载[]可能是指针类的运算符?@cLMaine这是语义。为什么
+
总结?您使用了c风格的指针。它们不是类。但是,例如,
unique\u ptr
重载了[]运算符。我只是想问为什么它会取消引用?是否存在某种重载[]可能是指针类的运算符?@cLMaine这是语义。为什么
+
总结?您使用的是c风格的指针。它们不是类。但是,例如,
unique\u ptr
重载了[]运算符。您认为@NuPagadi应该记笔记吗?谢谢!顺便问一下:)您认为@NuPagadi应该记笔记吗?顺便说一句,谢谢!:)