我发现结构的第一个元素的地址与结构的地址相同。但是取消引用结构的地址不会返回第一个数据成员的值。但是,取消引用第一个数据成员的地址确实会返回其值。例如。结构的地址=100,结构的第一个元素的地址也是100。现在,取消引用应该以相同的方式在两者上工作。
法典:
#include <iostream>
#include <cstring>
struct things{
int good;
int bad;
};
int main()
{
things *ptr = new things;
ptr->bad = 3;
ptr->good = 7;
std::cout << *(&(ptr->good)) <<" " << &(ptr->good) << std::endl;
std::cout << "ptr also print same address = " << ptr << std::endl;
std::cout << "But *ptr does not print 7 and gives compile time error. Why ?" << *ptr << std::endl;
return 0;
}
*ptr
返回一个类型为 things
的实例,没有定义operator <<
,因此编译时错误。
结构与数组不同†。也就是说,它不一定衰减到指向其第一个元素的指针。事实上,编译器可以自由(并且经常)在结构中插入填充,以便它与某些字节边界对齐‡。因此,即使struct
可以像数组一样衰减(坏主意),简单地打印它也不能保证打印第一个元素!
† 我的意思是像 int[]
这样的 C 样式数组
‡ 这些边界依赖于实现,通常可以通过预处理器语句以某种方式控制,例如pragma pack
尝试以下任一方法:
#include <iostream>
#include <cstring>
struct things{
int good;
int bad;
};
int main()
{
things *ptr = new things;
ptr->bad = 3;
ptr->good = 7;
std::cout << *(int*)ptr << std::endl;
std::cout << *reinterpret_cast<int*>(ptr) << std::endl;
int* p = reinterpret_cast<int*>(ptr);
std::cout << *p << std::endl;
return 0;
}
您可以强制转换指向 Struct 的指针,指向结构的第一个元素的指针,以便编译器知道使用什么大小和对齐方式从内存中收集值。如果你想要一个"干净"的强制转换,你可以考虑先将其转换为"VOID 指针"。
_ (结构*) 到 (VOID*) 到 (FirstElem*) _
另请参阅:Stackoverflow
中的指针希望对您有所帮助!!
我发现结构的第一个元素的地址与结构的地址相同。
无论你在哪里发现这一点,它都不是 c++ 标准。在一般情况下,这是一个不正确的假设。
如果你继续沿着这条道路走下去,对你来说只有苦难和痛苦。