c中指针的类型转换

时间:2017-06-27 12:14:37

标签: c pointers

char指针转换的整数指针是如何工作的? 我有一个整数值为320的程序,我将其转换为char *。它将显示输出64.我想知道它是如何工作的?

#include <stdio.h>

int main()
{
    int i=320;
    char *p=(char*)&i;
    printf("%d",*p);

    return 0;
}

3 个答案:

答案 0 :(得分:4)

好吧,在您的小端系统上,我们假设sizeof (int)为4。

然后i的内存如下:

   +--+-+-+-+
i: |64|1|0|0|
   +--+-+-+-+

这是因为320是0x00000140,即320 = 1 * 256 + 64。

因此,您将p设置为指向第一个字节(64),然后取消引用它以便读取单个字节。

你的最后一行是错的,你的意思是:

printf("%d\n", *p);

答案 1 :(得分:2)

引用C11,章节§6.3.2.3,强调我的

  

指向对象类型的指针可以转换为指向不同对象类型的指针。如果   结果指针未正确对齐引用类型,行为是   未定义。否则,当再次转换回来时,结果应该等于   原始指针。 当指向对象的指针转换为指向字符类型的指针时,   结果指向对象的最低寻址字节。连续递增   结果,直到对象的大小,产生指向对象剩余字节的指针。

因此,二进制表示看起来像(little-endian architecture assumed, based on output you presented)

  00000001 01000000
    ^^         ^^
    HAB        LAB              HAB- High Address Byte, LAB - Low Address Byte

并且,通过演员,你基本上指向

           01000000

部分。因此,取消引用会将该值生成为整数结果(01000000) 2 == (64) 10 。< / p>

注意:只有字符类型指针才能对任何其他指针类型进行别名。不要尝试使用与源类型不兼容的其他目标类型。

答案 2 :(得分:1)

不同的值是由于截断;它还取决于平台的字节顺序值640,如果存储在16字节的int中,则具有以下二进制模式。

0000 0001 0100 0000

如果将指向这两个字节的指针强制转换为char的指针,则它将引用低位字节,如下所示。

0100 0000

但是,此位模式的数值为64,这是程序的输出。