变量地址的运算符[]是如何工作的

How does operator [] of an address of variable work?

本文关键字:何工作 工作 地址 运算符 变量      更新时间:2023-10-16

例如:

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)。在您的代码中,由于N0,我们只剩下*(&x),它只是取消引用我们刚刚创建的指针,返回变量本身。


您在其中发现的代码实际上是未定义的行为。当他们进行时

float & operator[](int i){
return ((&x)[i]);
}

他们假设类中没有填充,并将3个独立的成员视为一个数组。但是,不能做出这种假设,并且访问被明确地称为标准中未定义的行为。