質問: strより、strに入っている文字列abcdeをchar* p により、ポインタpの指すアドレスの番号ではなく、アドレスに入っている文字列abcde(文字コード)が渡される。そして、for文の++pにより文字列のアドレスに入っている文字コードの数値が+1されるのでポインタpが先頭のアドレスから表す文字列はbcdeとなる、それから***pには文字コードが一つしか入らない**ようなので、「b」だけが入る、そして、**なぜかデバッグの結果より[0]に*pに代入されたbが代入され、 strの中身の数列はbcdeとなっているので、なんで[6]にbが代入されないのかわからないですが**、*pに代入されたbが代入されたbが[0]として、bbcdeとなりました。 太い黒字で書いた部分の疑問がわかりません。 1. 疑問1 なぜ*pには文字コードが一つしか入らないのか。 2. 疑問2 なぜ[0]に*pに代入されたbが代入されたのか、個人的には文字列は最後に表示するためてっきりbcdebだと思っていました。 ![デバッグの画像です。](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/e0cfd6ee2944319af7038531745801b4.png)
回答: ポインタそのものをインクリメントしたりするとややこしさがますので、添字を使って書き換えてみましょう。 ``` #include int main(void) { char str[] = { "abcde" }; for (size_t i = 0; str[i]; ++i) { ++str[i]; printf("%s\n", &str[i]); } } ``` さて、ここで`str`は配列型ですが、配列型はいくつかの例外を除いて常に配列の先頭要素へのポインタとして読み替えられるのでした(array to pointer conversion)。つまり`&str[i]`は`str + i`と等価です。なので ``` #include int main(void) { char str[] = { "abcde" }; for (size_t i = 0; str[i]; ++i) { ++str[i]; printf("%s\n", str + i); } } ``` のように書くこともできますね。 さて、このように書き換えると > > 疑問1 なぜ*pには文字コードが一つしか入らないのか。 > > > はそもそも変数`p`を排除したのでなくなり > > 疑問2 なぜ[0]に*pに代入されたbが代入されたのか、 > > > は`++str[i]`のようになったので、配列の要素をインクリメントしていることがより明確にわかります。 このように添え字を使ってアクセスするとわかりやすくなると思います。 ・・・と追うような話が前橋和弥氏の「C言語ポインタ完全制覇」にかかれていますので読んでみてください。ふるい方でも新版でも大丈夫です。