如何在C ++中对void *指针进行类型转换?

时间:2014-08-16 23:06:30

标签: c++ casting

我有以下代码:

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    float _t100;
    void * _t200;
    float _t300;
    _t100 = -5.0;
    _t200 = &_t100;
    _t300 = *(float *)&_t200;
    cout<<_t300;
    return 0;
}

打印-1.61669。为什么?它应该打印-5.0。

5 个答案:

答案 0 :(得分:5)

这是因为&_t200_t200的地址。由于_t200void*,因此其地址为void **

我认为你打算这样做

_t300 = *(float*)_t200;

顺便说一下,保留以_开头的符号;你不应该这样命名变量。

答案 1 :(得分:1)

您的代码中还有一个&:此行

_t300 = *(float *)&_t200;

不需要&符号,因为_t200已经是指针:

_t300 = *(float *)_t200;

demo

答案 2 :(得分:1)

您的错误在这里:

_t300 = *(float *)&_t200;

您正在使用_t200的地址,将其设为void**,因此当您打印时,您实际上打印的地址为t_200

答案 3 :(得分:1)

在您的代码中,您没有投放void* - 您正在投射&_t200,这是void**。如果省略&,就会得到想要的结果。

答案 4 :(得分:1)

这种表现

*(float *) &_t200;

将指针_t200占用的内存重新解释为float对象,并计算该float值。即您看到的-1.61669指针_t200本身(即地址)的内容被重新解释为float

这可能不是你想要做的。

如果您想要访问存储在-5.0中的原始_t100值,则必须重新解释内存_t200 指向,而不是记忆_t200占据了自己。以下表达式

*(float *) _t200;

会做到这一点。