char指针转换的整数指针是如何工作的? 我有一个整数值为320的程序,我将其转换为char *。它将显示输出64.我想知道它是如何工作的?
#include <stdio.h>
int main()
{
int i=320;
char *p=(char*)&i;
printf("%d",*p);
return 0;
}
答案 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
,这是程序的输出。