您写道您想找到内存偏移量。虽然 FredOverflow 所写的完全正确,但Test如果您想知道 和 的地址,a您应该创建一个类的实例。例如:bc
Test t;
float *ptr = &t.a;
float *ptr1 = &t.b;
float *ptr2 = &t.c;
在我的机器上,这会产生以下三个地址:
0x7fff564f8918
0x7fff564f891c
0x7fff564f8920
您会注意到它们sizeof(float)相隔 4 个字节(或 ),并且 a 的大小Test为 12 个字节(使用sizeof(Test))。此外, 的地址与 的&t地址0x7fff564f8918相同&t.a。这就是类实例的内存布局是如何Test形成的。
您还可以POD使用 查找类型成员的偏移量offsetof()。
cout << offsetof(Test, a) << endl;
cout << offsetof(Test, b) << endl;
cout << offsetof(Test, c) << endl;
产量
0
4
8
注意offsetof(Test, b)本质上是一样的
(unsigned long long) &(((Test*) 0)->b) - (unsigned long long) (Test*) 0
回答您的后续问题:
由于与前面提到的相同的错误,该代码将不起作用。但是,如果您想计算y成员的地址origin并为其分配值0,则可以这样做:
class Point3d {
public:
float x, y, z;
};
Point3d origin;
origin.y = 10;
// We take the address of origin, which points to the first member,
// then add the offset to the member y.
float *ptr = (float*) ((unsigned long long) &origin + offsetof(Point3d, y));
cout << "Old value: " << *ptr << endl;
*ptr = 0;
cout << "New value: " << *ptr << endl;
产生输出:
Old value: 10
New value: 0
再次记住,这只是可能的,因为Point3d它是一种POD类型。