c - 这行代码 `ptr=(char *)&a;` 实际上是做什么的?

标签 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 的新手,所以请用简单的术语解释答案。提前致谢。

最佳答案

这叫做 cast .在 C 语言中,强制转换允许您将值从一种类型转换或重新解释为另一种类型。当你获取float的地址时,你会得到一个float*;将其转换为 char* 会为您提供一个指向内存中相同位置的指针,但假装那里存在的是 char 数据而不是 float 数据。

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

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

关于c - 这行代码 `ptr=(char *)&a;` 实际上是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7571044/

相关文章:

c - 读取由 exec() 用 C 创建的子管道

c - 将int舍入到最接近的以0结尾的更大的int(C语言)

c - Windows 服务作为控制台应用程序运行,但作为服务自动关闭

c - 如何正确访问此结构中的指针?

c - Perl XS : Memory management

c - 选择不能正常工作

c - 使用格式字符串打印返回地址

c - 如何计算这些 C 表达式?

c - 使用mingw32编译时出现链接错误

c - 与循环迭代相比的内存分配效率