2017-09-08 12 views
0

int a[]={1,2,3};のような配列の場合には、cout<<a;という文字列を出力すると、配列の最初の要素のアドレスが出力されることがわかりました。しかし、文字配列char a[]="Jayesha";の場合、cout<<a;を実行すると、アドレスの代わりに配列全体が出力されます。我々は&a[0]を印刷する場合にも、それは、「Jayesha」、&a[1]版画「Ayeshaさん」、&a[2]版画「yesha」印刷し&a[3]版画「ESHA」とそれがなぜ起こるように...文字配列の名前がアドレスの代わりに配列全体を出力する

は誰が説明してくださいことはできますか?

+2

あなたは 'operator <<'を読んで、 'std :: cout << ...'が実際に何をするかを考えなければなりません –

答えて

0

const char* a = "Jajesha";は、Cスタイルの文字列を指します。メモリ内でそれはのように見える

J a j e s h a \0 ??? 
^ 
a 
^ ^  ^ ^
&a[0] &a[2]  &a[6] &a[8] 
^ ^  ^
    &a[1] &a[3]  &a[7] 

あなたはいくつかのポインタ算術をしています。
&a[x]は、a+xに相当します。 これはタイプconst char *になります。

長さを超えてアクセスする場合は、> 7つの文字あなたのケースでは、結果は未定義であり、それは\0

+0

私はconst char *を意味すると思います –

+0

あなたは正しい –

0

これは演算子のオーバーロードによるもので、herehereと説明されています。

あなたの2つのケースでは、const void*、住所、またはconst char*という文字列の内容を印刷しています。

0

を見つけるまで異なる二つがあります

const char *意志出力のcout<<すべての文字をクラッシュすることがありますここで使用されているstd::ostream& <<の過負荷。

最初はstd::ostream& << void const*、次はstd::ostream << const char*です。すべてのポインタはvoid const*に変換可能で、配列は最初の要素へのポインタに変換されます。

<<に非文字データの配列を渡すときは、最も一致するのはvoid const*オーバーロードで、アドレスを出力します。

文字データの配列を<<に渡すと、最もよく一致するのはchar const*オーバーロードです。このバージョンでは、NULLで終了する文字列へのポインタがあり、そのバッファを出力するものと仮定しています。

これを避けるには、<<に渡す前にアレイ上でstatic_cast<void*>を実行します。

関連する問題