使用的C指针与char数组(using C Pointer with char array)

2019-08-02 18:44发布

int i=512;
char *c = (char *)&i;
c[0] =1;
printf("%d",i);

这将显示“513”,它增加了1到i。

int i=512;
char *c = (char *)&i;
c[1] =1;
printf("%d",i);

而这将显示256. 2分频,可有人请解释一下为什么? 非常感谢

Answer 1:

二进制

以二进制表示的32位的数字512,仅仅是:

00000000000000000000001000000000

因为2至9功率为512按照惯例,你读从右到左位。

下面是二进制的一些其他的十进制数:

0001 = 1
0010 = 2
0011 = 3
0100 = 4

的角色:重新解释为智力字节数组

当你这样做:

int i = 512;
char *c = (char *)&i;

您正在解释4字节整数作为字符(8位字节)的阵列,你可能知道。 如果不是,这里发生了什么:

&i

取变量的地址i

(char *)&i

重新解释它(或它投射 )的指针的字符类型。 这意味着现在可以像一个阵列使用。 由于已知的int是至少32位在机器上,可以通过访问它的字节c[0], c[1], c[2], c[3]

根据字节序的体系,数量的字节可能进行布局:最显著字节在前(大端),或至少显著字节第一(小端)。 x86处理器是小端。 这基本上意味着数量512被布置为在上面的例子,即:

00000000 00000000 00000010 00000000
    c[3]     c[2]     c[1]     c[0]

我已经分组的位转换成对应于它们在存储器中规定的方式单独的8位的块(字节)。 请注意,您也看过他们从右到左这里,所以我们可以保持与惯例二进制数字系统。

后果

现在设置c[0] = 1具有这样的效果:

00000000 00000000 00000010 00000001
    c[3]     c[2]     c[1]     c[0]

其是2^9 + 2^0 == 513十进制。

设置c[1] = 1具有这样的效果:

00000000 00000000 00000001 00000000
    c[3]     c[2]     c[1]     c[0]

这是2^8 == 256十进制,因为你已经用00000001 覆盖第二个字节00000010

大端系统上千万注意,这些字节将存储在相反的顺序,以小端系统。 这意味着你会得到完全不同的结果给那些你得到了,如果你运行它在这些机器中的一个。



Answer 2:

记住炭8位,512是位表示是
512 = 10 0000 0000

当你这样做char *c = (char *)&i; 你做:

c[1] = 10
c[0] = 0000 0000

当你C [0] = 1,则使10 0000 0001这是513。

当你C [1] = 1,则使01 0000 0000 ,其为256。



Answer 3:

之前,你想知道为什么你看到的是“奇”,考虑你运行你的代码的平台,而字节顺序在其中。

然后,请考虑以下

int main(int argc, char *argv[])
{
    int i=512;
    printf("%d : ", i);
    unsigned char *p = (unsigned char*)&i;
    for (size_t j=0;j<sizeof(i);j++)
        printf("%02X", p[j]);
    printf("\n");

    char *c = (char *)&i;
    c[0] =1;
    printf("%d : ", i);
    for (size_t j=0;j<sizeof(i);j++)
        printf("%02X", p[j]);
    printf("\n");

    i = 512;
    c[1] =1;
    printf("%d : ", i);
    for (size_t j=0;j<sizeof(i);j++)
        printf("%02X", p[j]);
    printf("\n");
    return 0;
}

在我的平台上(的Macbook Air,Mac OS X 10.8,英特尔的x64拱)

512 : 00020000
513 : 01020000
256 : 00010000

情侣你上面看到你所希望了解字节序 ,你可以清楚地看到我的平台是小端 。 所以,什么你的吗?



Answer 4:

因为你是混叠的int通过char指针和char的宽度为8位(一个字节),分配:

c[1] = 1;

将第二字节设置i000000001 。 字节1,3和4(如果sizeof(int) == 4 )将保持不变。 以前,第二个字节为000000010 (因为我假设你是一个基于x86的计算机,这是一个little-endian的架构上。)因此,基本上,你转移已设置一个姿势要正确的唯一位。 这是由2师。

在一个小端机和32位编译器int ,你原来有这四个字节i

  c[0]      c[1]      c[2]     c[3]
00000000  00000010  00000000 00000000

转让后, i被设置为:

  c[0]      c[1]      c[2]     c[3]
00000000  00000001  00000000 00000000

因此它去从512到256。

现在你应该明白为什么c[0] = 1导致513 :-)想想哪个字节设置为1,并且分配不改变其它字节都没有。



Answer 5:

这是因为你的机器是小端 ,这意味着最低显著字节先存储在内存中。

你说int i=512;5120x00000200以十六进制(假设为简单起见32位OS)。 让我们来看看如何i会被存储在内存中的十六进制字节:

  00 02 00 00  // 4 bytes, least-significant byte first

现在,我们解释该相同的存储单元通过执行一个字符数组char *c = (char *)&i; - 同样的记忆,不同的解释

  00 02 00 00
c[0][1][2][3]

现在,我们改变c[0]c[0] =1; 和存储的样子

  01 02 00 00

这意味着,如果我们把它看作一个小端int试(做printf("%d",i); ),这是十六进制0x00000201 ,这是513 (十进制)。

现在,如果我们回去换c[1]c[1] =1; ,你的记忆现在变成:

  00 01 00 00

现在我们回去把它解释为小端int ,这是十六进制0x00000100 ,这是256 (十进制)。



Answer 6:

它取决于机器是否是在little endianbig endian是如何将数据存储在bits.for更多阅读关于字节序

C语言并不能保证这一点。

512 in binary :

    =============================================
    0000 0000 | 0000 0000 | 0000 0010 | 0000 0000   ==>512
    =============================================
      12          34          56          78       

(此为int 0×12345678假设地址)

char *c =(char *)&i now c[0] either point to 0x78 or 0x12
Modifying the value using c[0] may result to 513 if it points to 0x78
    =============================================
    0000 0000 | 0000 0000 | 0000 0010 | 0000 0001   ==> 513
    =============================================

or, can be 

    =============================================
    0000 0001 | 0000 0000 | 0000 0010 | 0000 0000  ==>2^24+512
    =============================================

同样,对于256也:因为你的c 1将有2个字节的地址由右。 下图中,

    =============================================
    0000 0000 | 0000 0000 | 0000 0001 | 0000 0000  ==>256
    =============================================

因此,它在我们的系统中的数字表示的FPGA实现



文章来源: using C Pointer with char array