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

时间:2011-09-27 14:42:36

标签: c

我有代码:

#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的新手,所以用简单的语言解释答案。提前谢谢。

4 个答案:

答案 0 :(得分:6)

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

(顺便说一下,如果循环已经

,它会更整洁
for (i=0; i<sizeof(a); i++)
    printf("%d ", ptr[i]);

答案 1 :(得分:6)

这称为cast。在C中,使用强制转换可以将值从一种类型转换或重新解释为另一种类型。当您获取float的地址时,您会获得float*;将其转换为char*会为您提供指向内存中相同位置的指针,但假装其中存在char数据而不是float数据。

sizeof(float)4,因此根据IEEE-754 single-precision format,从该位置开始打印四个字节可以得到组成浮点数的字节。有些字节设置了高位,因此当解释为signed char然后转换为int进行显示时,它们会因two's-complement representation而显示为负值。

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

答案 2 :(得分:2)

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

语句*ptr++在读取其值后递增指针,这意味着,您读取指向的值(浮点数的单个字节),然后将指针前移一个字节的偏移量。 / p>

答案 3 :(得分:1)

&a获取a的地址,也就是说,它会生成类型为float *的指针。然后将类型为float *的此指针强制转换为类型为char *的指针。

由于sizeof(char) == 1a现在可以通过ptr看作一个字节序列。

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