int main()
{
int i=21;
char *p;
p=(char*)&i;
printf("%d",*p);
getch();
return 0;
}
printf
语句给了我完美的答案,但我认为它不应该有,因为 'p'
是一个字符指针,它将能够保存其基地址但是 int
占用两个空格,*p
不能给我整数值,因为它会指向地址让我们说 X
但是 int
存储在两个字节中,因此需要从 X
和 X+1
地址收集值,但我运行了这段代码并给了我值,或者我对此有错误的认识吗?
最佳答案
p=(char*)&i;
这将 p
指向 i
中的最低地址。这是低位字节还是高位字节的地址取决于系统的字节顺序。 (它甚至可以是一个内部字节……PDP-11 是小端字节序,但长整数(32 位)首先存储高阶 16 位字,因此字节顺序为 2,3,0,1。)可能您在小端机器(x86 是)上运行,所以它指向低位字节。
*p
鉴于小端,这会获取 i
的低位字节,即 (char)21,然后默认转换为 int,给出 (int)21,并打印 21 . 如果 i
包含一个 > 255 的值,您将得到“错误”的结果。此外,如果它包含一个 > 127 和 < 256 的值,并且 char 在您的系统上签名——它会打印一个负值。
由于结果取决于机器的字节序,并且是实现定义的,因此不可移植,除非您的特定目标是确定机器的字节序,否则您不应该做这种事情。新手程序员应该花更少的时间去理解为什么糟糕的代码有时“有效”,而是学习如何编写好的代码。一般规则(有很多异常(exception)):带有转换的代码是糟糕的代码。
关于c - 在字符指针中取整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25579381/