我最近尝试通过将几个指针的值打印到控制台来调试一个小程序。第一个是结构的内存地址,其他是其字段的内存地址。代码的精简版本如下:
#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
如果实际上只是它的第一个字段,因此没有任何字段或方法,是否有意义?