このプログラムの実行中:
#include <iostream>
int main()
{
char *name = "abc";
int i = reinterpret_cast<int>(name);
std::cout<<i<<std::endl;
return 0;
}
次の出力が得られました。
4202656
この数字は何を表しているでしょうか?メモリアドレスですか?でも、何のメモリアドレス?「abc」は文字の配列としてメモリに格納されていませんか?
ありがとう。
このプログラムの実行中:
#include <iostream>
int main()
{
char *name = "abc";
int i = reinterpret_cast<int>(name);
std::cout<<i<<std::endl;
return 0;
}
次の出力が得られました。
4202656
この数字は何を表しているでしょうか?メモリアドレスですか?でも、何のメモリアドレス?「abc」は文字の配列としてメモリに格納されていませんか?
ありがとう。
未定義です。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;
}
おそらく文字「a」のアドレスです。
これが保証されているとは思いませんが (つまり、int はアドレスを保持するのに十分な長さではない可能性があります)。
あなたはおそらく質問を見たいと思うでしょう: reinterpret_cast を使用する代わりに void* を介してキャストする
簡単に言えば、それは何でもあり得るということです。
これは「abc」の最初の文字のメモリアドレスなので、「a」です。配列は、配列の最初の値を指すポインターであるためです。
普通にやるとcout << *(name++)
「b」が出力されます。
したがって、キャストするときはname
、「a」を指すアドレスをキャストしようとします