【发布时间】:2012-11-20 23:40:53
【问题描述】:
我最近尝试通过将几个指针的值打印到控制台来调试一个小程序。第一个是结构的内存地址,其他是其字段的内存地址。精简版代码如下:
#include <iostream>
struct testingPointers
{
int i;
float f;
double d;
} test;
int main()
{
std::cout << &test << '\n' << &(test.i) << '\n' <<
&(test.f) << '\n' << &(test.d);
}
输出是:
0x681110
0x681110
0x681114
0x681118
(显然,不同运行的确切值不同,但它们之间的相对位置始终相同)。
我很困惑,因为第一个指针的值——test 的内存位置——与第二个指针(test 的第一个字段)的值相同。这是否意味着对象没有真正唯一的内存地址,并且指向结构或类的指针只是指向其第一个字段?如果是这样,像
a.b
a->b
a.b()
如果a 实际上只是它的第一个字段,因此没有任何字段或方法,是否有意义?
【问题讨论】:
-
不,它们是不同类型的指针。但是第一个字段位于对象的开头。所以它具有相同的起始地址。 (除非开头有 vtable 指针之类的。)
-
如果一个指向我自己头顶的指针也是一个指向我头顶的指针,这是否意味着我不存在,因为我真的只是一个头?
标签: c++ oop pointers struct field