我不认为memcpy()
它是为你想要的而设计的。通常,您将使用memcpy()
复制一个或多个完整对象(其中对象可能是 int、char、long long 等)
int a[4] = { 1, 2, 3, 4 };
int b[3];
int c[5] = { 0 };
::memcpy(b, a, 3 * sizeof(int)); // b is { 1, 2, 3 }
::memcpy(c+2, b, 3 * sizeof(int)); // c is { 0, 0, 1, 2, 3 }
c+2 不是“c + 2 个字节”。它是“c + 2 ints”(在 Win32/x86 系统上为 8 个字节)。
您可以通过转换为 char 或 unsigned char 指针来访问各个字节,但我不建议您这样做,除非您真的了解自己在做什么,因为有很多陷阱。
unsigned x = 0;
unsigned char *px = reinterpret_cast<unsigned char *>(&x);
px[0] = 0xFF;
px[2] = 0xAA;
这里的危险之一是您假设知道计算机如何存储整数。在 x86 系统上,x 将为 0x00AA00FF,但在 Sun Sparc 系统上,x 将为 0xFF00AA00。
如果您需要设置整数的一部分,通常最好使用“或”和“移位”。
x = (0xFF<<24) | (0xAA<<8);
在任何架构上都会给你 0xFF00AA00 。0xFF<<24 将值 0xFF 向左移动 24 位,形成 0xFF000000。0xAA<<8 将值 0xAA 向左移动 8 位,形成 0x0000AA00。
我们将它们“或”在一起,给出 0xFF00AA00。