c - 在字符指针中取整数值

标签 c pointers

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

    printf("%d",*p);

    getch();
    return 0;
}

printf 语句给了我完美的答案,但我认为它不应该有,因为 'p' 是一个字符指针,它将能够保存其基地址但是 int 占用两个空格,*p 不能给我整数值,因为它会指向地址让我们说 X 但是 int 存储在两个字节中,因此需要从 XX+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/

相关文章:

c - 将 JSON 库与我的 AVR 微 Controller 代码集成时遇到困难

c - 如何在 Windows 上检测进程的体系结构?

c - printf 不工作(指针)

android - 如何使用 parse.com android 将数据放入指针归档

c++ - 如何在 C++ 中序列化一个保留指向其他对象的指针的对象?

c++ - 如何将指针作为双指针传递给类的指针属性?

c - 如何处理 Ansi C 中传递的无效参数

c - 除了蛮力搜索之外,如何在凸包中找到最大的三角形

c - 将指针分配给整数数组时指针类型不兼容

C# 奇数列表行为