C为什么void指针不能存储浮点值?

VM *_*ova 3 c pointers

我正在尝试返回浮点值但是当我打印出来时,我得到0.0.

float floating = 4.5;

void* function(){
    void* test = &floating;
    return test;
}

int _tmain(int argc, _TCHAR* argv[]){
     printf("%f\n", test());
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

关于它为什么不打印4.5的任何想法?对不起,如果这是一个菜鸟问题,我还是比较新的.

Sou*_*osh 9

假设你function()实际上拼test(),%f需要一个float值.你提供的是void *.这是错误的和未定义的行为.

解决方案:void作为一个不完整的类型,您不能void直接取消引用指针.在解除引用之前,需要将指针强制转换为所需类型.例如,

printf("%f\n", *( (float *) test() ) );
Run Code Online (Sandbox Code Playgroud)


gio*_*gim 5

尝试

printf("%f\n", *( (float*)function() ));
Run Code Online (Sandbox Code Playgroud)


小智 5

试图提供更多有关的细节:

首先,从你如何处理你的问题,你应该理解指针不存储值,它们存储对象的地址.void根本就没有类型,void *指针可能存储任何地址(只要它的数据,但我不想在这里过度复杂化我的答案).

这可能是你从一开始就来自哪里的.但后来你犯了两个错误:

  1. %f格式说明符printf()不指望一个指针,它期望的值.有一个操作称为取消引用指针,该指针获取指针指向的值.在表达式中,您可以在值前面将dereferencing运算符写为星号(*)以执行此操作.

  2. 那么如何在不知道类型的情况下读取值呢?你不能!这就是解除引用void *指针是非法的原因.意思是,即使你没有忘记星号并写了例如printf("%f\n", *(test()));,代码也是错误的(这次,你的编译器会捕获错误).

这就是说,void *在指针是指作为一个通用的指针,因此隐式转换为和从任何其他数据指针类型(注意,这是在不同的).因此,正确编写程序的一种方法是:

int _tmain(int argc, _TCHAR* argv[]){
     float *f = test();
     printf("%f\n", *f);
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:void *可以隐式转换为/从其他数据指针类型的事实跟随你test()可以这么简单:

void *test()
{
     return &floating;
}
Run Code Online (Sandbox Code Playgroud)

edit2:由于你是指针的新手,添加一个与你的问题没有直接关系的建议:在的变量声明中,星号绑定标识符(变量名),而不是类型.这意味着您int * foo;不会读作"foo是指向int的类型指针的变量",而是"foo是int类型的指针变量".这有一个严重的含义,当编写eg int * foo, bar;- foo将是一个指针,bar一个正常的变量.因此,建议是:通过写void *test代替而不是void* test.