您是否可以在类成员变量上使用指针来增加或减少任何变量?或者为什么不呢?
例如,结构或类
struct MyStruct {
int x;
int y;
int z;
};
int main()
{
MyStruct Obj;
int *p = &Obj.x;
cout << *p << endl;
cout << p++ << endl;
cout << p++ << endl;
}
我还注意到Obj的地址及其变量是相同的。
答案 0 :(得分:5)
x
与Obj
具有相同的地址 - 对于没有父类或虚拟成员的结构,这是有保证的。 x
,y
和z
将其排序保留在内存中,这也得到了保证。结构成员之间可能存在填充,这是特定于实现的,因此您无法安全地假设您的代码是可移植的。
答案 1 :(得分:1)
变量可能具有不同的大小,并且在不同的成员变量之间可能存在填充空间,因此只需像示例中那样递增指针通常不起作用。
答案 2 :(得分:0)
通常它会按顺序存储,您可以阅读it here.。但我认为不可能做你的建议,因为这不是一个普遍的事实。
答案 3 :(得分:0)
很确定这不是保证行为。也就是说,您可能会找到一些发生的示例,但我不相信它是ANSI标准的一部分,因此您的结果可能会有所不同。
答案 4 :(得分:0)
不保证行为;指针运算仅在数组对象中定义。根据标准:
如果指针操作数和 结果指向相同的元素 数组对象,或者是最后一个对象 数组对象的元素, 评估不得产生 溢出;否则,行为是 未定义。
答案 5 :(得分:0)
正如其他人所说,你不能可靠地做到这一点。您可以做的事情如下:
size_t offsets[] = {
offsetof(MyStruct, x),
offsetof(MyStruct, y),
offsetof(MyStruct, z) };
size_t size_offset = sizeof offsets / sizeof offsets[0];
for (size_t i = 0; i < size_offsets; ++i)
std::cout << *(&Obj + offsets[i]) << std::endl;
但如上所述,这种用途非常有限。如果您发现自己这样做,您可以确定您的计划存在严重的设计缺陷。