ID非公開

2021/4/5 19:38

55回答

C++,文字列のポインタについて

C言語関連 | プログラミング22閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

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

ありがとうございました。よく分かりました。

お礼日時:4/10 15:18

その他の回答(4件)

0

"ABC"は文字列リテラル(文字列定数)。 …と書くと、「文字列そのもの」と勘違いしがちだけど、しかしCやC++自体には「文字列」という「データ型」は存在しない。 では文字列リテラルとはなんなのか?というと、「その文字列が収納されたアドレス」。 理解してもらえるかどうかは分からんけど、 char *p="ABC"; と書くと、コンパイル時に strABC:db "ABC",0 といったアセンブリコードが生成され、 変数pにはラベルstrABCの値が代入される、というわけ。 なぜアドレスそのものではなく、そのアドレスに置かれた文字列が表示されるのか? 答えは単純明快。coutがそういう設計になっているから。 C++には「引数の型によって呼び出す関数を変える」という機能がある。この機能を使えば「引数としてchar型へのポインタが指示された場合は、そのポインタが指し示す文字列を表示する」ということができる。で、実際coutはそのようにしている、というだけの話。

0

文字列の場合、コンパイル時に文字列を指すポインタを生成するので、 char *p = "ABC"; は文字列"ABC"を指すポインタ(みえないですがp0としておきます)をpに代入しているみたいな感じです。つまり、 char *p0 = &"ABC"[0]; char *p = p0; という感じに解釈できるのかなと。 一方で配列の場合、配列を指すポインタは生成されませんので、 int *p = x; は配列xの先頭アドレスがそのままポインタpに代入されます。 このあたりはアセンブラ見るとはっきりわかるのでアセンブラで確認してみるのもオススメします。 あと僕はc++はなんもわからないのですみませんが前半部分についてだけで終わりにします。

0

"ABC"は、テキストエリアにある、ABCというデータの存在する先頭アドレスになります。 その為、"ABC"[1] とかすると、'B'が得られます。 cout で、char型へのポインタを渡すと、自動的に文字が表示されるのは、 << 演算子がオーバーロードされていて、 左右の型が ストリーム << char* である場合には、文字列の先頭アドレスだとして、ストリームに文字列を出力するよう、作られているからです。 文字列配列の場合は ストリーム << string* みたいな形になると思うので、それとは別の定義が呼び出されます。 (演算子のオーバーロードは、データの型によって、演算子の機能が変化する機能です)

0

> これは配列名(xのこと)はその配列の先頭要素のアドレスとして解釈されるから これが正確に理解できていません。 配列型を持つ式が、その先頭要素のポインタに暗黙に型変換されるのです。 式 x は配列型(int[5]型)なので、先頭要素のポインタに型変換されます。 "ABC" は、型 const char[4] 型の式です。 したがって、先頭要素のポインタに型変換されます。 > char* p = &"ABC"; これは違います。 書くとしても、 char* p = &"ABC"[0]; です。 > ”ABC”を表示する際,cout << p;とすれば表示することが出来るのも腑に落ちません これは、こういう関数が呼び出されているということと同じです↓ void print(const char* str) {     while (*str != '\0') {         putchar(*str);         ++str;     } } print("ABC"); > pにはアドレスが格納されているのでアドレスが表示されてしまうように思えてしまいます void* 型であれば、アドレスが表示されますが、const char* 型なので、文字列として出力するように、operator<< がオーバーロードされています。 cout << (void*)p; であれば、アドレスになります。