例如:
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]);
}
他们假设类中没有填充,并将 3 个独立的成员视为一个数组。但是,无法做出这种假设,并且访问被明确称为标准中的未定义行为。
关于c++ - 变量地址的运算符[]如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920024/