在字符指针中取整数值

时间:2014-08-30 05:35:53

标签: c pointers

int main()
{
    int i=21;
    char *p;
    p=(char*)&i;

    printf("%d",*p);

    getch();
    return 0;
}

printf语句给了我完美的答案,但我认为它不应该有,因为'p'是一个字符指针,它可以保存其基址但int占用两个空格,*p不应该给我整数值,因为它会指向地址让我们说Xint存储在两个字节中,因此需要从{{1 }}和X地址,但是我运行了这段代码并给了我价值,或者我对此有错误的见解?

1 个答案:

答案 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在您的系统上签名 - 它将打印一个负值。

由于结果取决于机器的字节顺序,并且是实现定义的,因此不可移植,除非您的具体目标是确定机器的字节顺序,否则不应该这样做。开始的程序员应该花费更少的时间来理解为什么有时不好的代码"工作"而是学习如何编写好的代码。一般规则(有很多例外):带有强制转换的代码是错误的代码。