我发现结构的第一个元素的地址与结构的地址相同。但解除引用结构地址并不能返回第一个数据成员的值。但是,取消引用第一个数据成员的地址确实会返回它的值。例如。结构的地址= 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;
}
答案 0 :(得分:1)
*ptr
返回一个类型为things
的实例,其中没有定义operator <<
,因此编译时错误。
结构与数组†不同。也就是说,它不必衰减到指向其第一个元素的指针。事实上,编译器在结构中是自由的(并且通常是)insert padding,以便它与某些字节边界‡对齐。所以即使如果 struct
可能会以与数组相同的方式衰减(坏主意),只需打印它就不能保证打印第一个元素!
†我的意思是像int[]
‡这些边界是依赖于实现的,通常可以通过预处理器语句(如pragma pack
答案 1 :(得分:1)
尝试these中的任何一个:
#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;
}
答案 2 :(得分:0)
您可以将指向Struct 的指针转换为指向结构的第一个元素的指针,以便编译器知道要用于收集的大小和对齐方式来自记忆的价值。
如果你想要一个“干净”的演员,你可以考虑先把它转换成“VOID指针”
_(Struct *)到(VOID *)到(FirstElem *)_
另见:
Pointers in Stackoverflow
希望它有所帮助!!
答案 3 :(得分:0)
我发现结构的第一个元素的地址与结构的地址相同。
无论你发现什么,它都不是c ++标准。在一般情况下,这是一个不正确的假设。
如果你继续沿着这条道路前进,那就没有痛苦和痛苦。