私は次のコードを持っています
#include <iostream>
using namespace std;
int main(){
int i;
char *p="this is a string";
i=reinterpret_cast<int>(p);
cout<<i<<"\n":
return 0;
}
出力は次のとおりです: 7648 reinterpret_cast について説明してください
私は次のコードを持っています
#include <iostream>
using namespace std;
int main(){
int i;
char *p="this is a string";
i=reinterpret_cast<int>(p);
cout<<i<<"\n":
return 0;
}
出力は次のとおりです: 7648 reinterpret_cast について説明してください
reinterpret_cast
キャストしているデータは、変換が実行されずに別の型と見なされます。標準によると、 a の後の動作が定義されているのreinterpret_cast
はreinterpret_cast
、元の型に戻ることだけです。
これは少し役に立たないように思えますが、これを使用する理由の 1 つは、たとえば C++ で特定の C ライブラリ (pthreads など) を使用する場合です。コールバックを含む多くの C ライブラリは、タイプのパラメーターをコールバックに渡しvoid*
ます。C++ では、これに対処する適切な方法は、パラメーターとして使用したいものへのポインターを取得し、reinterpret_cast
それをvoid*
C ライブラリーに渡すときにポインターを取得してからreinterpret_cast
、実際にコールバック内にあるものに戻すことです。
標準によって定義された動作であることが保証されているわけではありませんが、ほとんどのプラットフォーム/コンパイラでreinterpret_cast
は、同じビット パターンを使用してデータが異なる型であると単純に見なされます。たとえば、d
たまたまビット パターンが である 32 ビットの double があり01101010 00111100 01101010 01000001
、 と書くと、int i = reinterpret_cast<int>(d)
ビットパターンがi
となる整数になります01101010 00111100 01101010 01000001
。 . そして明らかに、関連する型が同じサイズでない場合、これによりすぐに問題が発生する可能性があります。
ここを参照してください。
具体的に何が不明ですか?具体的にお願いします。また、質問する前に検索してください。これについては SO で多くの質問があります。
reinterpret_cast<>
p
here へのポインターをチェックせずに変換しますが、これが何を表すint
かを推測することはできません。int
あなたができる唯一のことは、このポインターを元の状態に戻すことです。
p
より実際的な注意として、コンパイラは へのアドレスポイントをint
値に入れる可能性がありますが、int
サイズはシステム ポインタのサイズと一致しない可能性があるため、おそらくuintptr_t
の代わりにそのようなものを使用する必要がありint
ます。
整数の文字列表現を実際の整数値に変換しようとするBoostlexical_cast<>
のようなものを使用できますが、それがここでの目標であったかどうかはわかりません。
説明することはあまりありません。の結果reinterpret_cast
はプラットフォーム固有です。テスト出力は、文字列定数のアドレスか、強制的にint
.