2

私が取り組んでいるプロジェクトでは、このタイプのコードをよく見かけます。

reinterpret_cast<long>(somePointer)

そして、私はこれの要点を理解していません。通常、ユーザー定義クラスに使用されます。つまり、 somePointer はユーザー定義クラスのインスタンスへのポインターです。

助けてくれてありがとう

4

6 に答える 6

0

ポインターは実際には整数値にすぎず、コンパイラーがそれをメモリーアドレスとして解釈するだけです。

これは、他の整数型がアドレスを保持するのに十分な大きさであれば、それを他の整数型に格納できることを意味します (たとえば、64 ビット アドレスを 16 ビット整数変数に格納することはできません)。

しかし、C++ はポインターと通常の整数値を別個の異なる型と見なすため、通常のキャストを行うだけではなく、ポインターを として再解釈longするようコンパイラーに要求する必要がありreinterpret_castます。

于 2013-07-26T12:17:05.117 に答える
0

ショーンが言ったように、ポインターを数値であるかのように操作するのに役立ちます。

これを使用して基本的なハッシュ関数を実装するMSDN Web サイトの例を次に示します (これは long ではなく unsigned int を使用することに注意してください。ただし、原則は同じです)。

unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}

これは任意のポインターを取り、そのポインターに対して (事実上) 一意のハッシュ値を生成します。ポインターを として扱い、unsigned int整数値をそれ自体のビット シフト バージョンと XOR し、結果を に切り捨てunsigned shortます。

ただし、他の皆さんもおっしゃっているように、これは非常に危険であり、避けるべきです。

于 2013-07-26T12:25:03.600 に答える
0
reinterpret_cast<long>(somePointer)

このコードは、 が保持するアドレスを にキャストします。C ++11 の符号付き/符号なし整数型には、orを使用することsomePointerをお勧めします。これらは、void ポインターから変換された値を保持することができ、元のポインターと同等の値を持つその型に変換されます。longintptr_tuintptr_t

于 2013-07-26T12:20:39.817 に答える