2011-01-28 6 views
1

をreinterpret_castは:C++は、このプログラムを実行するには

#include <iostream> 
int main() 
{ 
char *name = "abc"; 
int i = reinterpret_cast<int>(name); 
std::cout<<i<<std::endl; 
return 0; 
} 

を私は次の出力を得た:

4202656

この数字は何を表しているのでしょうか?それはメモリアドレスですか?しかし、何のメモリアドレス? "abc"はメモリ内に文字の配列として格納されていませんか?

ありがとうございました。

+0

を指すアドレスをキャストしてみてください。どのコンパイラを使用していますか? g ++はキャストにエラーを出します。 – DumbCoder

+0

@DumbCoder。 'char * name =" abc ";'とタイプすると、同じ**出力** – Simplicity

答えて

4

未定義です。 sizeof(int)はsizeof(char *)と等しくないかもしれません。厳密なエイリアシングルールがここでも適用されるかどうかはわかりません。

しかし実際には、それらのサイズが実際に等しいと仮定すると(ほとんどの32ビットプラットフォーム)、4202656は配列の最初の文字のアドレスを表します。私はこれをよりきれいにこのようにします:

#include <iostream> 
int main() 
{ 
    const char *name = "abc"; // Notice the const. Constant string literals cannot be modified. 
    std::cout << static_cast<const void*>(name) << std::endl; 
} 
3

おそらく文字 'a'のアドレスです。
これは保証されているとは思えませんが(つまり、intはアドレスを保持するのに十分な長さではないかもしれません)。

+0

ヨークが得られます。私がchar * name = "abc"と入力すると、同じ出力が得られます – Simplicity

+0

@ user588855:あなたのコメントを理解していません。それはあなたのコードと同じです。 –

0

あなたはおそらく、質問を見てみたい:casting via void* instead of using reinterpret_cast

短い答えは、それがすべてで何もすることができることです。

+0

標準が言っています。結果は、基礎となるメモリアーキテクチャを理解している誰かには驚くべきことではありません。 [注:これは、基盤となるマシンのアドレッシング構造を知っている人にとっては驚くべきことではありません。 - 終了ノート]

0

"abc"の最初の文字のメモリアドレスで、 "a"です。配列は配列の最初の値を指すポインタであるためです。
cout << *(name++)の場合は、通常 "b"が印刷されます。

nameをキャストするときだから、あなたはreinterpret_cast演算子は、その引数と同じビットパターンを持つ新しいタイプの値を生成する「」

関連する問題