指针解引用的C / C ++问题

时间:2013-09-05 07:15:22

标签: c++ c pointers

代码:

#include <stdio.h>
int main()
{
  float a = 12.01;
  int *b = (int *)&a;
  printf("%p\n%p\n%f\n",&a,b,*b);
  return 0; 
}

b包含a的地址,然后在取消引用b时,它会提供垃圾值?

请回答,我在导出类指针指向基类对象时遇到了同样的问题。

2 个答案:

答案 0 :(得分:2)

  

b包含a的地址,然后在取消引用b时,它会给出垃圾值吗?

首先,您使用狡猾的演员指向float,但假装您指向其他类型int

然后你读取值,给出未定义的行为;通常,如果两个类型的大小相同,您将获得表示浮点数的位模式,这看起来像垃圾。

然后将那个狡猾的int值作为与printf说明符匹配的%f参数传递,该说明符需要double。这会产生更多未定义的行为;最有可能的是,它会将一些随机内存解释为double值,从而产生完全垃圾。

如果要检索预期的浮点值,则需要转换回正确的类型:*(float*)b。如果要将转换为int,请转换该值,而不是指针:int b = (int)a;。这里的演员表并不是绝对必要的,但是一些编译器可能会警告隐式转换会丢失信息。

  

当导出类指针指向基类对象时,我遇到了同样的问题。

这是一个不同但相关的问题。再一次,你在说谎指针指向什么类型,如果你试图使用该指针来访问错误的对象类型,你将得到未定义的行为。

也许如果你问一个关于这种情况的更具体的问题,解释为什么你认为你需要狡猾的演员,我们可以建议你如何在类型系统中实现你想要的东西。

答案 1 :(得分:-1)

试试这个......

#include <stdio.h>

int main()
{
 float a = 12.01;
 void *b = (int *)&a;
 printf("%p\n%p\n%f\n",&a,b,*(float *)b);
 return 0; 
}