2016-03-19 15 views
1

私はC++を学ぶための基本を勉強していますが、文字やポインタについて次のものを解読しようとすると壁を叩き続けます。何が起こっているのかについての私の現在の理解を与える行コメントが含まれています。私は以下のようなコードがあることを考える:char *を表示すると、アドレスではなく文字列が返されるのはなぜですか?

using namespace std; 
    int main() 
    { 
      //String literal is an array of chars 
      //Array address gets assigned to a ptr of char 
      char myletters[] = {'h','i'}; 
      char* lp = myletters; 
      cout << *lp << endl; 

      //Logically equivalent to above statements 
      char* letters2 = "hi"; 
      cout << *letters2 << endl; 

      //String literal turns into array of chars 
      //Array of chars gets assigned to a ptr of chars 
      //Each ptr of chars gets stored into letters array 
      char* letters[] = {"hi","hello"}; 
      cout << *letters << endl; 
    } 

を私の出力は次のようになります。

h 
h 
hi 

私の質問は:私は*手紙の内容を印刷するには、最終的なCOUTを使用するときに、なぜ私は入手できますか"hi"のアドレスまたは "hi"の最初の文字のアドレスではなく、文字列 "hi"?私はcoutの最初の使い方がcharを出力していること、そして最後のcoutがchar *を出力していることを知っていますが、なぜポインタではなく、完全な文字列を出力するのか不思議です。

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

+0

'char * 'を持つ' operator <<() 'には特別なオーバーロードがあります。 –

+1

@πάνταῥεῖあなたはそれが答えであるため、答えを出すべきです。 – BrainStone

+0

すべての文字列関数は文字列ポインタで機能します。メモリ位置が必要な場合は、長い__(long)stringPtr__へポインタをキャストしてください。 –

答えて

0

<<オペレータには、それが参照するC文字列を出力するchar*の特別な定義があります。

*letterschar*タイプ(という文字 char**と同じ char*[]を)持っているあなたの場合

、およびないchar*lpとして持っています。

+1

アドレスを出力するためにそれを追加すると、 'void *'にキャストして、 'const char *'のオーバーロードをもう使わないようにする必要があります: 'cout << static_cast (* letters)<< endl; ' –

関連する問題