出産前後の痔にはご注意!

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

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

std::ostream に const char* が << されたときの挙動:


std::ostream& operator<<(std::ostream&, const char*)
が定義されているから。
    • good
    • 0
この回答へのお礼

回答を有難うございます。正直定義の内容を理解できませんが、論理ではなく定義の問題によるという事だと理解しました。
つまりはcoutの定義上charの変数はアドレスではなく内容を返すという事ですよね。論理上、配列の変数をポインタに代入した場合(p=ss)やはりアドレスが渡されている様なので。試しにint型でやってみたら、アドレスが表示されました。

時間が出来ましたら、標準ライブラリの定義なども勉強してみます。

C++でchar型変数のアドレスを表示するcoutに代わる物はあるのでしょうか?

お礼日時:2006/10/01 18:32

> C++でchar型変数のアドレスを表示するcoutに代わる物はあるのでしょうか?



const void* にキャストしたらどうなります?
cout << (const void*)char_ptr; のように。
    • good
    • 0

ANo.3


> #include <iostream>に定義してある std::cout は
> どんな型のアドレスも表示してくれません。

異議アリ。
const void* を << したときの振る舞いは明確に定義されています。
    • good
    • 0

前のおふた方の回答はあってますし、丁寧に書いています。


が、長いので一言でくくります。

///////////////////////////////////////
#include <iostream>
main()
{
  char a[] = "aaaaa";
  std::cout << a << std::endl;

  return 0;
}
/////////////////////////////////////////////
#include <iostream>に定義してある std::cout は
どんな型のアドレスも表示してくれません。
char型のアドレスを入力したら文字列が表示される、と覚えるといいです。

独学と勝手な判断だから適当に読んで。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/01 18:35

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);
とか作ってみるとおもしろいかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/01 18:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング