uint data1;
ushort data2;
ushort data3;
uchar data4[8];
std::uint8_t buff[16];
std::uint8_t* out = buff;
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out);
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data2), 2, out);
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data3), 2, out);
std::copy_n(quid.data4, 8, out);
如果我不使用out
,为什么reinterpret_cast
中的结果会有所不同?
答案 0 :(得分:4)
std::copy_n(&quid.data1, 4, out);
就像quid.data1
被声明为uint data1[4]
一样。结果是quid.data1
被复制到out[0]
并且out
的其他3个元素变得垃圾。
std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out);
将data1
的内容视为4个字符的数组,如果sizeof(uint)==4
则可以使用。
答案 1 :(得分:4)
结果会有所不同,因为&x
的类型为T *
,其中T
是x
的类型,指针算术将+ 1
视为“推进指针由sizeof(T)
“组成,因此实际上您将指针视为指向该类型元素数组的指针。
如果更改指针的类型,您将把它指向的内存视为不同类型的元素数组 - 例如,将int
视为{{1}的数组1}} S上。