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
?
Результат будет другим, потому что &x
имеет тип T *
, где T
это тип x
и указатель обрабатывает арифметику + 1
как «продвижение указателя по sizeof(T)
msgstr «, так что в действительности вы рассматриваете указатель как указатель на массив элементов этого типа.
Если вы измените тип указателя, вы будете обрабатывать память, на которую он указывает, как массив элементов другого типа — например, обрабатывать int
как массив char
s.
std::copy_n(&quid.data1, 4, out);
работает как будто quid.data1
были объявлены как uint data1[4]
, Результатом является то, что quid.data1
копируется в out[0]
и 3 других элемента out
получить мусор.
std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out);
относится к содержанию data1
как массив из 4 символов, это будет работать, если sizeof(uint)==4
,