プログラミング言語C,C++について質問があります. 配列名は,配列の一番初めの要素のアドレスを表していますよね?

プログラミング言語C,C++について質問があります. 配列名は,配列の一番初めの要素のアドレスを表していますよね? 画像の出力画面で分かる通り,int型の配列の配列名は,メモリのアドレスを表しています. しかし,char型の配列の配列名を出力してみると,アドレスではなく文字列そのものを出力していますがこれはなぜですか. また,文字列を出力する際に文字列の一番目の'h'で出力が終わらずに,"hello"まで出力されているのは,'o'の後ろにあるnull文字までcoutが出力するからですよね? 現在,配列とポインタの勉強を少し始めているのですが,今まで当たり前にやっていたことに疑問を持ってしまいました.教えてほしいです.

画像

ベストアンサー

2

C言語の場合であれば、 printf("%p",s1); とすれば、s1のアドレスが出ますし、 printf("%s",s1); とすれば、s1のアドレスから始まる文字列が出ます。 つまり、s1から受け取ったアドレスを使って何をするか?といつのは、 呼び出された関数側が決める事なのです。 C++の場合は、演算子のオーバーロードという機能を使って、 << という演算子の機能を拡張しています。 それにより、<< の左右に来る変数の型によって内部で呼び出される関数が切り替わり、行われる処理が変わります。 その中の一つに、char型ポインタ(文字配列の先頭アドレス)を受け取ったら、 それを文字列とみなして、文字表示をする。という実装がなされているのです。 つまり、いちいち"%s"とか"%d"とかのフォーマットを指定しなくても、 自動的に渡された型に応じて printf("%s",s1); 相当の処理が行われるという仕組みになっています。

2人がナイス!しています

ThanksImg質問者からのお礼コメント

c++においては使い勝手を向上させるために,文字列配列のポインタ値(配列名)を標準出力すると文字列がそのまま表示されるようになっているんですね!他の解答者さんの意見も参考にしてchar配列のアドレスを表示させるコードをいくらか書くことができました.ありがとうございます!

お礼日時:9/27 23:08

その他の回答(3件)

1

cout (というか ostream) が、const char* を特別扱い してるからです。 専用の operator<< 関数をオーバーロードしてる。 そうじゃないと不便だろう、ってことで。 coyr << "Hello, world" << endl; で ポインタ値 が出ても、困るでしょ?

1人がナイス!しています

char* じゃないポインタ型としてcoutに与えれば、 ポインタ値が出ます。 #include <iostream> int main() {     using namespace std;     char s2[] = "hello";     cout << s2 << endl;     cout << static_cast<void*>(s2) << endl; }

1

<<がそのように実装されているから。 printf(“%pで出力すればポインタ値が出力される。

1人がナイス!しています