int i=40;
char *p;
p=(char *)&i;//What actually happens here?
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)
什么是输出?请帮忙!
p=(char *)&i;//What actually happens here?
Run Code Online (Sandbox Code Playgroud)
它获取地址i
并将其转换为char
指针.所以*p
现在的值是第一个字节i
.这个价值是什么,取决于平台.
让我们先看看在如何内容启动i
并p
在内存中会进行布局(假设大端顺序):
Item Address 0x00 0x01 0x02 0x03 ---- ------- ---------------------- i 0x08000000 0x00 0x00 0x00 0x28 p 0x08000004 0x?? 0x?? 0x?? 0x??
由于p
被声明为自动变量,因此它不会初始化为任何内容,并且包含由...表示的随机位模式0x??
.
在线
p = (char *)&i;
Run Code Online (Sandbox Code Playgroud)
表达式&i
求值为地址i
,或0x08000000,其类型为pointer to int
,或int *
.强制转换将类型转换int *
为char *
,并将结果分配给p
.
以下是赋值后内存中的内容:
Item Address 0x00 0x01 0x02 0x03 ---- ------- ---------------------- i 0x08000000 0x00 0x00 0x00 0x28 p 0x08000004 0x08 0x00 0x00 0x00
所以价值p
是现在的地址的i
.在线
printf("%d", *p);
Run Code Online (Sandbox Code Playgroud)
表达式的类型*p
是char
,它的值是存储在地址0x08000000中的任何值,在这种特殊情况下是0.由于printf
是可变函数,因此值*p
从类型提升char
到类型int
.
因此对于这种特殊情况,输出为"0".如果订单是little-endian,那么地图就会像
Item Address 0x03 0x02 0x01 0x00 ---- ------- ---------------------- i 0x08000000 0x00 0x00 0x00 0x28 p 0x08000004 0x08 0x00 0x00 0x00
输出将是"40".
请注意,整个示例假设整数和字符指针具有相同的大小和布局; 这并不能保证在任何地方都是真实的(参见在线C标准(n1256草案),第6.2.5节,第27段),所以你不能以你期望的方式依赖于这种工作(假设我认为这是正确的)int
并且char
不是标准定义的兼容类型,但我可能错了).一般来说,打字是不安全的.
给你
int i = 40;
//为整数i分配内存并为其赋值40
char *p = (char*)&i;
Run Code Online (Sandbox Code Playgroud)
所以在这里你定义一个指针变量,并在将其转换为 i 后为其分配 i 的地址char*
假设i
分配在,1021 address
所以 p 将具有该地址,限制为 1 个字节,因此它应该保存 first 8 bit from the representation of 40;
由于 40 已被覆盖在 2 字节的前 8 位下,因此它将保存相当于 40 的字符,但当您用它打印时,它%d
应该打印40
;
归档时间: |
|
查看次数: |
12902 次 |
最近记录: |