取消引用结构以获取第一个成员的值
Dereference a structure to get value of first member
我发现结构的第一个元素的地址与结构的地址相同。但是取消引用结构的地址不会返回第一个数据成员的值。但是,取消引用第一个数据成员的地址确实会返回其值。例如。结构的地址=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++ 标准。在一般情况下,这是一个不正确的假设。
如果你继续沿着这条道路走下去,对你来说只有苦难和痛苦。
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 在构造函数中从另一个类成员构造一个类成员
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行