变量地址的运算符[]如何工作?
How does operator [] of an address of variable work?
例如:
int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5
我在一本书中找到了这种 3DVector 表示:
struct Vector3D{
float x,y,z;
Vector3D() = default;
Vector3D(float a, float b, float c) : x(a), y(b), z(c) {}
float & operator[](int i){
return ((&x)[i]);
}
};
如果将其用作:
Vector3D myVec(0,2,3);
std::cout<<myVec[0]<<std::endl;
std::cout<<myVec[1]<<std::endl;
std::cout<<myVec[2]<<std::endl;
它将打印 x、y、z 的值
它是如何工作的?这安全吗?
当您执行 &x
时,您会得到一个指向 x
的指针。当您执行 pointer[N]
时,编译器所做的就是将其转换为 *(pointer + N)
。在您的代码中,因为 N
是 0
我们只剩下 *(&x)
这只是取消引用我们刚刚创建的指针并返回变量本身。
您在其中找到的代码实际上是未定义的行为。当他们这样做时
float & operator[](int i){
return ((&x)[i]);
}
他们假设 class 中没有填充,并将 3 个单独的成员视为一个数组。但是,无法做出此假设,并且访问被明确称为标准中的未定义行为。
例如:
int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5
我在一本书中找到了这种 3DVector 表示:
struct Vector3D{
float x,y,z;
Vector3D() = default;
Vector3D(float a, float b, float c) : x(a), y(b), z(c) {}
float & operator[](int i){
return ((&x)[i]);
}
};
如果将其用作:
Vector3D myVec(0,2,3);
std::cout<<myVec[0]<<std::endl;
std::cout<<myVec[1]<<std::endl;
std::cout<<myVec[2]<<std::endl;
它将打印 x、y、z 的值
它是如何工作的?这安全吗?
当您执行 &x
时,您会得到一个指向 x
的指针。当您执行 pointer[N]
时,编译器所做的就是将其转换为 *(pointer + N)
。在您的代码中,因为 N
是 0
我们只剩下 *(&x)
这只是取消引用我们刚刚创建的指针并返回变量本身。
您在其中找到的代码实际上是未定义的行为。当他们这样做时
float & operator[](int i){
return ((&x)[i]);
}
他们假设 class 中没有填充,并将 3 个单独的成员视为一个数组。但是,无法做出此假设,并且访问被明确称为标准中的未定义行为。