当我尝试使用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 *之间转换有问题?
答案 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)