例如:
#include <iostream>
using namespace std;
int main(){
int *a;
a = new int[2];
a[1] = 1;
}
据我所知,在“堆内存”中分配了一个2大小的int数组,指针a
获取了新创建的数组的内存地址。但是,当试图访问(例如)数组的第二个索引(a[1]
)时,它只是在没有星号运算符的情况下这样做而且我不明白为什么,我习惯于看到存储的值在指针指向的内存地址中,*pointername
访问,而不是pointername[value]
。
所以我的问题是,为什么我们使用下标运算符来访问指向没有星号运算符的数组的指针?
答案 0 :(得分:2)
在C ++中,将operator[]
应用于索引为p
的指针i
,其语义等效于
*(p + i)
和
*(i + p)
你可以把它想象成语法糖。另请注意,这意味着p[N]
等同于N[p]
。
答案 1 :(得分:1)
a[N]
是指针,则 *(a+N)
等于a
。因此,a[1]
取消引用指针a+1
。
答案 2 :(得分:0)
数组是一个包含多个相同大小元素实例的内存块, 下标运算符只是为原始指针的右元素放置一个偏移量。所以a [0]等于* a。和[1] = * a + 1 * sizeof(元素)所以从某种意义上说你是对的我们最后使用了星号运算符,它只是隐藏在语法糖之后。
答案 3 :(得分:0)
索引运算符对于基元数组具有特殊含义:array[index]
等同于*(array+index)
。一个副作用是,如果你想混淆你的代码,index[array]
意味着完全相同的事情(当然,对于原始类型)。对于原始数组,索引运算符是解除引用的语义糖。
对于非基本类型,类可以覆盖operator[]
。这与语义糖相反。