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;