需要澄清C中的unsigned char *

时间:2015-03-13 17:17:05

标签: c

鉴于代码:

...

int x = 123

...

unsigned char * xx = (char *) & x;

...

我有xx[0] = 123xx[1] = 0xx[2] = 0

有人可以解释这里发生了什么吗?我对指针一般都没有很好的理解,所以越简单就越好。

由于

4 个答案:

答案 0 :(得分:3)

您正按顺序访问little-endian char的字节(int s)。小端系统上123中的数字int通常会存储为{123,0,0,0}。如果您的号码为783 (256 * 3 + 15),则会将其存储为{15,3,0,0}

答案 1 :(得分:1)

我将尝试解释ASCII图片中的所有部分。

int x = 123;

此处,x是表示类型int的位置的符号。类型int在32位计算机上使用4个字节的内存,在64位计算机上使用8个字节。这也可以依赖于编译器。但是对于这个讨论,让我们假设32位(4字节)。

x86上的内存管理为“little endian”,这意味着如果一个数字需要多个字节(其值为> 255 unsigned,或> 127签名,单字节值),则该数字与一起存储最低地址中的最小有效字节。如果您的号码是十六进制的0x12345678,那么它将存储为:

x: 78        <-- address that `x` represents
   56        <-- x addr + 1 byte
   34        <-- x addr + 2 bytes
   12        <-- x addr + 3 bytes

你的号码(十进制123)是7B十六进制,或0000007B(显示所有4个字节),所以看起来像:

x: 7B        <-- address that `x` represents
   00        <-- x addr + 1 byte
   00        <-- x addr + 2 bytes
   00        <-- x addr + 3 bytes

为了更清楚,让我们为x组成一个内存地址,比如0x00001000。然后字节位置将具有以下值:

    Address   Value
 x: 00001000  7B
    00001001  00
    00001002  00
    00001003  00

现在你有:

unsigned char * xx = (char *) & x;

其中定义了一个指向 unsigned char 的指针(一个8位或1字节的无符号值,范围为0-255),其值是整数x的地址。换句话说,位置xx中包含的值为0x00001000

xx:  00
     10
     00
     00

&符号(&)表示您需要x地址。而且,从技术上讲,声明是不正确的。它应该被正确地投射为:

unsigned char * xx = (unsigned char *) & x;

所以现在你有一个存储在变量xx中的指针或地址。该地址指向x

    Address   Value
 x: 00001000  7B      <-- xx points HERE (xx has the value 0x00001000)
    00001001  00
    00001002  00
    00001003  00

xx[0]的值是xx指向偏移0字节的内容。它被 bytes 偏移,因为xx的类型是指向unsigned char的指针,它是一个字节。因此,xx的每个偏移量都是该类型的大小。 xx[1]的值在内存中只有一个字节,即值00。等等。图示地:

    Address   Value
 x: 00001000  7B      <-- xx[0], or the value at `xx` + 0
    00001001  00      <-- xx[1], or the value at `xx` + 1
    00001002  00      <-- xx[2], or the value at `xx` + 2
    00001003  00      <-- xx[3], or the value at `xx` + 3

答案 2 :(得分:0)

是的,你正在做一些你不该做的事情......

那说......结果的一部分是你正在研究一个小的Endian处理器。 int x = 123;语句在堆栈上分配4个字节,并使用值123初始化它;由于它是小端,内存在内存中看起来像123,0,0,0。如果它是大Endian,它将是0,0,0,123。您的char指针指向存储x的内存的第一个字节。

答案 3 :(得分:0)

unsigned char * xx = (char *) & x;

你取x的地址,你告诉编译器它是一个指向字符[string]的指针,你将它分配给xx,这是一个指向字符[string]的指针。转换为(char *)只是让编译器满意。

现在,如果您打印xx或检查它,它可能取决于您所看到的机器 - 所谓的little-endian或big-endian存储整数的方式。 X86是小端,并以反向方式存储整数的字节。因此,存储0x00000123将存储0x23 0x01 0x00 0x00,这是您在检查xx指向的位置时所看到的。