今回はreinterpret_castについて説明します。
reinterpret_castはポインタの型変換の際に使用するキャストです。
まずは、サンプルを1つ書きます。
<sample program cpp045-01>
#include <iostream> int main() { int intValue = 0x41424344; int *pInt = &intValue; char *pChar = pInt; std::cout << *pChar << std::endl; return 0; } |
<コンパイル結果>
error C2440: '初期化中': 'int *' から 'char *' に変換できません。 note: 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
C言語編のポインタのところで説明したように、別の型のポインタに代入する事は出来ません。
しかし、キャストする事で代入できるようになります。
※危険な事です!
<sample program cpp045-02>
#include <iostream>
int main()
{
int intValue = 0x41424344;
int *pInt = &intValue;
char *pChar = (char*)pInt;
std::cout << *pChar << std::endl;
return 0;
}
|
<実行結果>
D 続行するには何かキーを押してください・・・
C言語のキャストを使ってみました。
C言語のキャストは何のチェックも行っていませんので、危険な型変換も出来てしまいます。
実行結果は「 D 」ですが、これはintvalueに入っている「0x44」を文字で表示した結果です。
出力ストリームは渡された型によって表示形式を選択してくれます。
「char型ポインタの中身」であれば文字として表示するのです。
なぜ「 D 」が出るかはエンディアンのところを読んでください。
話を元に戻しましょう。
C言語のキャストをstatic_castに変更してみます。
<sample program cpp045-03>
#include <iostream> int main() { int intValue = 0x41424344; int *pInt = &intValue; char *pChar = static_cast<char*>(pInt); std::cout << *pChar << std::endl; return 0; } |
<コンパイル結果>
error C2440: 'static_cast': 'int *' から 'char *' に変換できません。 note: 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
コンパイルエラーになりました。
static_castでは、ポインタの型変換は出来ないのです。
エラーの下の「note」に書いてあります。
変換にはreinterpret_castを使え、と。
このreinterpret_castは危険なキャストで、C言語のキャストと同じく何も考えず型変換します。
プログラムを変更してみましょう。
<sample program cpp045-04>
#include <iostream> int main() { int intValue = 0x41424344; int *pInt = &intValue; char *pChar = reinterpret_cast<char*>(pInt); std::cout << *pChar << std::endl; return 0; } |
<実行結果>
D 続行するには何かキーを押してください・・・
実行出来ました。
C言語のキャストと同じ事が出来るのであれば、これに何の意味があるのか?と思われるかも知れません。
しかし、C言語と違って「ポインタの型変換をしてますよ!」という事が分かるのです。
C言語の場合は区別が付きませんからね。
次回はconst_castについて説明します。