• ベストアンサー

c++での配列とポインタについて

C++でC char ss[]="computer"と char=*pを宣言します。この場合ssにはs[0]のアドレスが入っているとの事ですが、これについていくつか質問があります。 1.アドレスが入っているのであれば p=ssは納得できるのですが、なぜcout<<ss でアドレスではなく"comupter"となるのでしょうか?(cout<<pの場合も)。 2.又cout <<&a[0]とするとアドレスではなく”computer"と表示されるのはなぜでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

std::ostream に const char* が << されたときの挙動: std::ostream& operator<<(std::ostream&, const char*) が定義されているから。

wachacha2
質問者

お礼

回答を有難うございます。正直定義の内容を理解できませんが、論理ではなく定義の問題によるという事だと理解しました。 つまりはcoutの定義上charの変数はアドレスではなく内容を返すという事ですよね。論理上、配列の変数をポインタに代入した場合(p=ss)やはりアドレスが渡されている様なので。試しにint型でやってみたら、アドレスが表示されました。 時間が出来ましたら、標準ライブラリの定義なども勉強してみます。 C++でchar型変数のアドレスを表示するcoutに代わる物はあるのでしょうか?

その他の回答 (4)

回答No.5

> C++でchar型変数のアドレスを表示するcoutに代わる物はあるのでしょうか? const void* にキャストしたらどうなります? cout << (const void*)char_ptr; のように。

回答No.4

ANo.3 > #include <iostream>に定義してある std::cout は > どんな型のアドレスも表示してくれません。 異議アリ。 const void* を << したときの振る舞いは明確に定義されています。

  • koedame
  • ベストアンサー率33% (10/30)
回答No.3

前のおふた方の回答はあってますし、丁寧に書いています。 が、長いので一言でくくります。 /////////////////////////////////////// #include <iostream> main() {   char a[] = "aaaaa";   std::cout << a << std::endl;   return 0; } ///////////////////////////////////////////// #include <iostream>に定義してある std::cout は どんな型のアドレスも表示してくれません。 char型のアドレスを入力したら文字列が表示される、と覚えるといいです。 独学と勝手な判断だから適当に読んで。

wachacha2
質問者

お礼

返信を有難うございます。 No1.の返信欄にまとめて書き込みをさせて頂きました。

回答No.2

C言語で考えてみると、 char ss[] = "computer"; char=*p; => char* p;の間違いでしょうか? p = ss; // 問題ないですよね。 printf("%s",ss); // 問題ないですよね とした場合、文字列Computerが表示されます。 C++で考えてみます。 printfでは、ssをどうやって表示するのかを%sだとか%dだとかで指定しています。たとえば、次のような例があります。 double d = 1.41421356; int i = 'a'; char* str = "hogehoge"; printf("%lf,%d,%c,%s",d,i,i,str); でもcout では、型をいっさい考えないで、 cout << d << "," << i << "," << str << "\n"; とすることができます。 これは、関数のオーバーロードというものです。ちょっとわかりにくいと思うので、簡単にoverprintという関数を考えてみます。 引数が異なる4種類のoverprintを定義します。 void overprint(int i){ printf("%d",i); } void overprint(double d){ printf("%lf",d); } void overprint(const char* str){ printf("%s",str); } void overprint(char c){ printf("%c",c); } さてここで、 char c = 'X'; overprint(c); とするとどの関数が呼ばれるでしょうか? これはコンパイラが自動的にvoid overprint(char c)と判断してくれます。 overprint((int)c);とすれば、void overprint(int i);が呼ばれます。 このように、同じ名前で引数が異なる関数を定義できて、自動的に正しい関数が呼ばれるのが関数のオーバーロードです。 coutは、このあたりの機能を使って、プログラマーに入出力の面倒を解放してくれているのです。 c++では、"<<"というものも関数ととらえています。 operator<<という関数に対応します。 いちどオーバーロード関数を作成して試して頂くとよいと思います。 double area(Triangle t); double area(Square s); double area(Square t); double area(Circle c); とか作ってみるとおもしろいかもしれません。

wachacha2
質問者

お礼

返信を有難うございます。 No1.の返信欄にまとめて書き込みをさせて頂きました。

関連するQ&A