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 バイト構造へのポインターに変換することです。これは意味のある方法では実行できません。

そうは言っても、実際に double を整数として解釈したい場合は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

after は、ポインターを宣言していることを意味します。*これは、通常の double とは大きく異なります。

C++ は、そのような別の型のポインターへのポインターを安全に static_cast することはできません。

このようなことをしたい場合は、最初に変数を逆参照する必要があります。

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

newdoubleとintegerは同じメモリ空間に存在できないため、使用する必要があります(正気で)

于 2010-03-18T22:04:42.580 に答える