C ++:不能从double *到int *的static_cast

时间:2010-03-18 22:01:13

标签: c++ casting static-cast

当我尝试使用static_cast将double *转换为int *时,我收到以下错误:

invalid static_cast from type ‘double*’ to type ‘int*’

以下是代码:

#include <iostream>
int main()
{
        double* p = new double(2);
        int* r;

        r=static_cast<int*>(p);

        std::cout << *r << std::endl;
}

我理解在double和int之间转换会有问题,但是为什么在double *和int *之间转换有问题?

5 个答案:

答案 0 :(得分:23)

您应该使用reinterpret_cast来投射指针,即

r = reinterpret_cast<int*>(p);

当然这毫无意义,

除非你想int级看double!你会得到一些奇怪的输出,我不认为这是你的意图。如果您想将p指向的转换为int,那么,

*r = static_cast<int>(*p);

此外,r已分配,因此您可以执行以下操作之一:

int *r = new int(0);
*r = static_cast<int>(*p);
std::cout << *r << std::endl;

或者

int r = 0;
r = static_cast<int>(*p);
std::cout << r << std::endl;

答案 1 :(得分:20)

除了指点之外,double*int*没有任何共同之处。您可以对Foo*Bar*指针类型对任何不同的结构说同样的事情。

static_cast表示源类型的指针可以使用作为目标类型的指针,这需要子类型关系。

答案 2 :(得分:4)

支持浮点到整数转换,因此int a = static_cast<int>(5.2)很好。但是,这是一种转换 - 底层数据类型完全不兼容。您要问的是,运行时将指向8字节结构的指针转换为指向4字节结构的指针,而这种指针无法以任何有意义的方式执行。

有人说过,如果你真的想把你的双解释为整数,int* r = reinterpret_cast<int*>(p)就行了。

答案 3 :(得分:0)

您可以使用static_cast<>在double和int之间进行转换,但不能在指向不同类型的指针之间进行转换。您可以使用void *将任何指针类型转换为static_cast<>或从int *转换。

基本原理可能是double *和{{1}}通常是有效的数组,并且实现不知道数组有多大。

答案 4 :(得分:-1)

因为您使用了double *而不是double

*之后意味着您正在声明一个指针,这与普通双指针有很大不同。

C ++无法安全地static_cast指向不同类型指针的指针。

如果您想要做这件事,首先必须取消引用该变量。

r=new int(static_cast<int>(*p));

您必须使用new,因为double和整数不能位于相同的内存空间(sanely)