★reinterpret_cast★


今回はreinterpret_castについて説明します。


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について説明します。


次へ

戻る

目次へ