C++ 为什么在没有星号运算符的情况下使用访问动态数组?
C++ why accessing dynamic array is used without the asterisk operator?
例如:
#include <iostream>
using namespace std;
int main(){
int *a;
a = new int[2];
a[1] = 1;
}
据我了解,在 "the heap memory" 中分配了一个 2 大小的 int 数组,指针 a
获取了新创建的数组的内存地址。但是,当尝试访问(例如)数组的第二个索引(a[1]
)时,它只是在没有星号运算符的情况下这样做,我不明白为什么,我习惯于看到存储的值在指针指向的内存地址中,访问方式为 *pointername
而不是 pointername[value]
。
所以我的问题是,为什么我们使用下标运算符来访问指向数组的指针而不使用星号运算符?
在 C++ 中,将 operator[]
应用于索引为 i
的指针 p
是
的语义等价物
*(p + i)
和
*(i + p)
您可以将其视为语法糖。另请注意,这意味着 p[N]
等同于 N[p]
.
如果 a
是一个指针,a[N]
等于 *(a+N)
。因此,a[1]
取消引用指针 a+1
.
数组是包含多个相同大小元素实例的内存块,
下标运算符只是为原始指针的正确元素设置一个偏移量。所以 a[0] 等于 *a。和 a[1] = *a + 1 * sizeof(element) 所以在某种意义上你是对的,我们最终确实使用了星号运算符,它只是隐藏在语法糖的后面。
索引运算符对于基元数组具有特殊含义:array[index]
等价于 *(array+index)
。一个副作用是如果你想混淆你的代码,index[array]
意味着完全相同的事情(当然对于原始类型)。对于原始数组,索引运算符是取消引用的语义糖。
对于非基本类型,类 可以覆盖 operator[]
。这与语义糖相反。
例如:
#include <iostream>
using namespace std;
int main(){
int *a;
a = new int[2];
a[1] = 1;
}
据我了解,在 "the heap memory" 中分配了一个 2 大小的 int 数组,指针 a
获取了新创建的数组的内存地址。但是,当尝试访问(例如)数组的第二个索引(a[1]
)时,它只是在没有星号运算符的情况下这样做,我不明白为什么,我习惯于看到存储的值在指针指向的内存地址中,访问方式为 *pointername
而不是 pointername[value]
。
所以我的问题是,为什么我们使用下标运算符来访问指向数组的指针而不使用星号运算符?
在 C++ 中,将 operator[]
应用于索引为 i
的指针 p
是
*(p + i)
和
*(i + p)
您可以将其视为语法糖。另请注意,这意味着 p[N]
等同于 N[p]
.
a
是一个指针,a[N]
等于 *(a+N)
。因此,a[1]
取消引用指针 a+1
.
数组是包含多个相同大小元素实例的内存块, 下标运算符只是为原始指针的正确元素设置一个偏移量。所以 a[0] 等于 *a。和 a[1] = *a + 1 * sizeof(element) 所以在某种意义上你是对的,我们最终确实使用了星号运算符,它只是隐藏在语法糖的后面。
索引运算符对于基元数组具有特殊含义:array[index]
等价于 *(array+index)
。一个副作用是如果你想混淆你的代码,index[array]
意味着完全相同的事情(当然对于原始类型)。对于原始数组,索引运算符是取消引用的语义糖。
对于非基本类型,类 可以覆盖 operator[]
。这与语义糖相反。