2016-04-01 15 views
-2

で立ち往生しています:私は、私はC++コードに遭遇してきた文字列と配列

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 
cout << "Greeting message: "; 
cout << greeting << endl; 

出力:Hello

を挨拶はサイズ6の配列であるので、挨拶を表示するだけで「H」を表示すべきであるので、 greeting[0]coutの場合、配列の先頭アドレスを表示しているためです。私はどこが間違っているのか分かりません。

+3

"H"のみを表示する理由を明確にしてください。 'greeting [0]'ではない 'greeting'を印刷しています – vu1p3n0x

+1

' greeting'は 'char *'というポインタに崩壊し、それが指し示す文字列全体が表示されます。最初の文字だけを印刷したい場合は 'cout << greeting [0] << endl;を使います。 – Unimportant

+0

これはcoutが文字列を表示する方法です... greetingは文字列なので、coutは "Hello"を表示しますが、 "greeting [0]"と書くと、coutは文字として 'H'を表示します。 – Shiv

答えて

2

greetingdecays to a pointerそれ自身。しかし、それが複雑に聞こえる場合は、coutが何をするかを理解するためのポインタとして見ることができます。

coutgreeting[0]から\0までの文字が印刷されます。それはsizeofまたは単項&演算子のオペランドである場合を除き

+0

私はそれをありがとう! –

6

表現「Tへのポインタ」型の表現に(「崩壊」)に変換するタイプ「TN -elementアレイ」の式の値は配列の最初の要素のアドレスになります。

これは、ステートメント

cout << greeting << endl; 

に発現greetingがタイプchar *の発現にタイプchar [6]の式から変換され、式の値が、最初の要素のアドレスであることを意味します。

ストリーム演算子<<は、それがタイプchar *の引数を受信した場合、それは0ターミネーターを見るまで、それはそのアドレスから始まる文字の配列を書き込むように定義されます。どのように動作するのかという単純な例があります:

std::ostream& operator<<(std::ostream& s, char *p) 
{ 
    while (*p) 
    s.put(*p++); 
    return s; 
} 

実際のオペレータ定義はもう少し複雑になりますが、それは基本的な考え方です。あなたがgreetingのちょうど最初の文字を印刷したい場合は

は、明示的にインデックスまたはその逆参照しなければならない:

cout << greeting[0] << endl; 

または

cout << *greeting << endl; 
1

あなたはアドレス値が

を書く見たい場合は
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 
cout << "Greeting message: "; 
cout << (void*)greeting << endl; 
    // ^^^^^^^ 

std::ostream& std::operator<<(std::ostream&, T type);は、const char*,const char[]およびcharである。

0

ここでは、挨拶は配列内の最初の要素へのポインタなので、次のようにします。 cout < < * greeting; 出力はH. になりますが、現実にはそれをcoutオブジェクトに渡すと、挨拶は単なるポインタではなく、操作上のオーバーロードのオペレータオーバーロードの内部実装による文字列であることが分かります。 それは問題ではありません、それだけで納得することができますそれを理解する。

関連する問題