int main()
{
int i=21;
char *p;
p=(char*)&i;
printf("%d",*p);
getch();
return 0;
}
printf
语句给了我完美的答案,但我认为它不应该有,因为'p'
是一个字符指针,它可以保存其基址但int
占用两个空格,*p
不应该给我整数值,因为它会指向地址让我们说X
但int
存储在两个字节中,因此需要从{{1 }}和X
地址,但是我运行了这段代码并给了我价值,或者我对此有错误的见解?
答案 0 :(得分:3)
p=(char*)&i;
这会将p
指向i
中的最低地址。这是低位字节的地址还是高位字节的地址取决于系统的字节顺序。 (它甚至可能是一个内部字节...... PDP-11是小端的,但是long(32位)先存储了高位16位字,因此字节顺序为2,3,0 ,1。)可能你在小端机器上运行(x86'是)所以它指向低位字节。
*p
给定little-endianness,这将获取i
的低位字节,即(char)21,然后将默认转换为int,给出(int)21,并打印21.如果{ {1}}包含值> 255,你会得到错误的"结果。如果它包含值> 127和< 256和char在您的系统上签名 - 它将打印一个负值。
由于结果取决于机器的字节顺序,并且是实现定义的,因此不可移植,除非您的具体目标是确定机器的字节顺序,否则不应该这样做。开始的程序员应该花费更少的时间来理解为什么有时不好的代码"工作"而是学习如何编写好的代码。一般规则(有很多例外):带有强制转换的代码是错误的代码。