2011-09-27 20 views
2

我的代码:实际上这行代码是`ptr =(char *)&a;`呢?

#include<stdio.h> 
void main(){ 
    int i; 
    float a=5.2; 
    char *ptr; 
    ptr=(char *)&a; 
    for(i=0;i<=3;i++) 
     printf("%d ",*ptr++); 
} 

我得到的输出102 102 -90 64。我无法预测它是如何出现的,我很困惑这条线ptr=(char *)&a;。任何人都可以解释我做了什么吗?和其他变量一样代码*ptr++递增?或者对于这种情况,还有其他的指针规则。

我是C的新手,所以用简单的话来解释答案。提前致谢。

回答

5

这被称为cast。在C中,转换允许您将一种类型的值转换或重新解释为另一种类型。当你拿到float的地址时,你会得到一个float*;将其转换为char*会为您提供指向内存中相同位置的指针,但假设其中存在的是数据而不是float数据。

sizeof(float)4,因此根据IEEE-754 single-precision format打印从该位置开始的四个字节将为您提供构成浮点数的字节。某些字节的高位已设置,因此当解释为signed char,然后转换为int以供显示时,由于它们的two's-complement representation,它们显示为负值。

表达式*ptr++相当于*(ptr++),其首先增加ptr然后取消其前值;您可以将其视为同时取消引用并推进ptr

2

ptr=(char *)&a;float变量的地址转换为类型为char的指针。因此,您现在将float的4个字节解释为单个字节,您使用for循环打印这些值。

*ptr++*ptr++读取指针后读取其值,即读取指向的值(float的单个字节),然后将指针向前移动一个字节的偏移量。

5

该行将地址a(表示为&a)转换为char*,即指向字符/字节的指针。然后printf循环以十进制形式打印a四个组成字节的值。

(顺便说一句,这本来是整洁如果循环已经

for (i=0; i<sizeof(a); i++) 
    printf("%d ", ptr[i]); 

1

&a得到的a地址,也就是说,它产生float *类型的指针。然后将该类型为float *的指针转换为类型为char *的指针。

因为sizeof(char) == 1,a现在可以通过ptr看到一个字节序列。

当您想要抽象变量的类型并将其视为有限的字节序列时,这非常有用,尤其适用于序列化和散列。

相关问题