22

当我尝试使用 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* 之间转换会出现问题?

4

5 回答 5

29

您应该reinterpret_cast用于转换指针,即

r = reinterpret_cast<int*>(p);

当然,这没有任何意义,

除非你想看int一个double! 你会得到一些奇怪的输出,我认为这不是你想要的。如果要将指向的值转换pintthen,

*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;
于 2010-03-18T22:04:58.023 回答
25

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

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

于 2010-03-18T22:05:10.813 回答
5

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

话虽如此,如果您真的想将您的双精度数解释为整数,int* r = reinterpret_cast<int*>(p)则可以正常工作。

于 2010-03-18T22:06:49.583 回答
1

您可以在 double 和 int 之间转换static_cast<>,但不能在指向不同类型的指针之间转换。您可以将任何指针类型void *static_cast<>.

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

于 2010-03-18T22:06:06.473 回答
-1

因为你用double *而不是double

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

C++ 不能安全地将指针静态转换为指向不同类型的指针。

如果你想做这样的事情,你必须首先取消引用变量。

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

您必须使用new,因为双精度和整数不能驻留在同一内存空间中(正常)

于 2010-03-18T22:04:42.580 回答