繁体   English   中英

C中的空指针

[英]Void Pointers In C

我是C编程的初学者,现在正在学习Pointers的概念。 这是我的代码->>

`#include<stdio.h>
 int main()
 {  
    char t='s';
    int a=10;
    float s=89;
    void *ptr;

    ptr =&s;
    printf("%c\t",*((char*)ptr));
    printf("%d\t",*((int*)ptr));
    printf("%f\t",*((float*)ptr));
    return 0;
  }`

我的问题是,当我引用一个指向浮点数的空指针指向Char时,为什么输出为空白,而对于整数则为1118961664。字节和体系结构!

通常, float s变量长4个字节,其值(89)以IEEE 754格式表示。 为了简单起见,让我们假设这一点。

第一个printf(char)将使用原始float变量s的第一个字节(因为一个C char = 1个字节)。 在这里,第一个字节是指位于float s的4个字节中最低存储位置的字节。 是的,这取决于机器的字节对齐方式。 输出很可能是空白的,因为第一个字节对应于一个ascii控制字符(例如0)。

第二个printf(假设int在您的机器/编译器中长4个字节)将与第三个printf占用相同的4个字节,但将它们打印为整数(请注意,整数与IEEE 754浮点数之间的区别)。 事实证明,IEEE 754的89表示形式对应于“ 1118961664”整数。 这也将取决于字节对齐。

第三个printf做正确的事,它将使用存储s的值(89)的字节,并将其解释为浮点数。 它应该打印89.0。 这不取决于字节对齐。

如果浮点数的大小或表示形式不同,则细节将发生变化(多少字节来自何处以及第二个printf打印多少个数字),但行为将相似。 还要注意,原则上前两个printf调用具有未定义的行为。

浮点数(即float类型)占用4个字节。 在此表达式*((char*)ptr))中,s的第一个字节被解释为字符。 在表达式*((int*)ptr)) ,如果sizeof(int)等于4,则将s的所有四个字节解释为一个整数。

由于float和int的内部表示形式不同,因此得到的结果也不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM