我正在尝试返回浮点值但是当我打印出来时,我得到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的任何想法?对不起,如果这是一个菜鸟问题,我还是比较新的.
假设你function()是实际上拼的test(),%f需要一个float值.你提供的是void *.这是错误的和未定义的行为.
解决方案:void作为一个不完整的类型,您不能void直接取消引用指针.在解除引用之前,需要将指针强制转换为所需类型.例如,
printf("%f\n", *( (float *) test() ) );
Run Code Online (Sandbox Code Playgroud)
小智 5
试图提供更多有关的细节:
首先,从你如何处理你的问题,你应该理解指针不存储值,它们存储对象的地址.void根本就没有类型,void *指针可能存储任何地址(只要它的数据,但我不想在这里过度复杂化我的答案).
这可能是你从一开始就来自哪里的.但后来你犯了两个错误:
该%f格式说明符printf()不指望一个指针,它期望的值.有一个操作称为取消引用指针,该指针获取指针指向的值.在c表达式中,您可以在值前面将dereferencing运算符写为星号(*)以执行此操作.
那么如何在不知道类型的情况下读取值呢?你不能!这就是解除引用void *指针是非法的原因.意思是,即使你没有忘记星号并写了例如printf("%f\n", *(test()));,代码也是错误的(这次,你的编译器会捕获错误).
这就是说,void *在指针Ç是指作为一个通用的指针,因此隐式转换为和从任何其他数据指针类型(注意,这是在不同的C++).因此,正确编写程序的一种方法是:
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:由于你是指针的新手,添加一个与你的问题没有直接关系的建议:在c中的变量声明中,星号绑定到标识符(变量名),而不是类型.这意味着您int * foo;不会读作"foo是指向int的类型指针的变量",而是"foo是int类型的指针变量".这有一个严重的含义,当编写eg int * foo, bar;- foo将是一个指针,bar一个正常的变量.因此,建议是:通过写void *test代替而不是void* test.