次のコード スニペットを考えてみましょう:
class Address { int i ; char b; string c; public: void showMap ( void ) ; }; void Address :: showMap ( void ) { cout << "address of int :" << &i << endl ; cout << "address of char :" << &b << endl ; cout << "address of string :" << &c << endl ; }
期待どおり、出力は表示されるはずです。 int、char、および string メンバー変数のアドレス。ただし、char 変数 b のアドレスは空白のままです。
この奇妙な現象は、<< が原因で発生します。演算子は、&b をアドレスではなく C スタイルの文字列として解釈します。 Char ポインタは、<< によってヌル終了文字シーケンスとして解釈されます。
この問題を解決して char 変数のアドレスを表示するには、次の修正コードを使用できます。
cout << "address of char :" << (void *) &b << endl;
ここでは、 &b を void * に明示的に変換する C スタイルのキャスト。これは、<< に指示します。演算子を使用して、文字シーケンスではなくアドレスとして処理します。より安全な代替方法は、static_cast を使用することです:
cout << "address of char :" << static_cast<void *>(&b) << endl;
int、char、および string メンバー変数が public として宣言されると、出力はわずかに変化します:
... int : something ... char : ... string : something_2
ここで、something_2 は常に something より 8 小さいです。
この違いこれは、コンパイラがパブリック メンバー変数をパディングして、メモリ アクセスに最適な位置に配置するために発生します。この場合、char 変数は 8 バイトにパディングされる可能性があり、その結果、int 変数と string 変数のアドレスに 8 バイトの差が生じます。
以上が「cout」が「char」メンバー変数のアドレスを正しく表示しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。