- ベストアンサー
プログラムの動作の流れとポインタの動きについて
- プログラムの動作の流れを順を追って説明します。
- ポインタの動きと関数の動きについて、特にfor文内の動作に重点を置いて教えます。
- プログラムの出力結果をもとに、ポインタの移動と文字列の出力がどのように行われるかを詳しく解説します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
変数の変化の追いかけ方について、あくまで例えですが ・10行目の文字列strがメモリ上のアドレス1000に配置されているものとします。 アドレス│値(char) ────┼──── 1000│ a ────┼──── 1001│ b ────┼──── 1002│ c ...(以下省略)... ・11行目のポインタp_strがアドレス2000に配置されているものとします。13行目でポインタp_strにstrの先頭位置が記録されます。 アドレス│値(charポインタ) ────┼──── 2000│1000 ・15行目でp_strの値1000に基づいて、[abcdefghij] が出力されます。 ・3行目のポインタpがアドレス3000に配置されているものとします。16行目で(ポインタの)ポインタpにp_strの位置が記録されます。 アドレス│値(charポインタのポインタ) ────┼──── 3000│2000 ・4行目の(*p)によってアドレス2000にアクセスし、その値を1つ増やします。アドレス2000(つまりp_str)の値は下のように変化します。 アドレス│値(charポインタ) ────┼──── 2000│1001 ・15行目でp_strの値1001に基づいて、[bcdefghij] が出力されます。 以降はこのくり返しです。 pがポインタのポインタであるのは、そうしないと関数hがアドレス2000にアクセスして値を増やすことができないためです。 (ところでAN.2の「15行目のようにすると」は「15行目を下のようにすると」の間違いでした。すみません)
その他の回答 (2)
15行目のようにすると、文字列の先頭の1文字だけを出力します。 printf("[%c]\n",*p_str); 一方、%sの場合は文字列を表し、必要なのは出力する文字列の先頭位置なので、与えるのは*p_strではなくp_strとなります。
お礼
こちらもありがとうございました!
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 16:h(&p_str); これが p_str++; ならわかりますか? 同じことを関数h がやってくれています。
お礼
はじめに解答していただきありがとうございました! あまりに初心者ですので、これだけでは少し理解ができませんでした。こちらの都合で申し訳ありませんがBAはAN2,3の方にさせていただきます。 ご協力ありがとうございました
補足
printf文での p_strですが、なぜ*p_strにならないのかということ、 関数hに計算が移る場合の、変数の変化の追いかけ方や、 ポインタのポインタとなっている部分がよくわかりません。。
お礼
なんとなくつかめたような気がします!(というかこれ以上説明しようがないレベルで教えていただけてるように感じます笑 分かりやすい解答ありがとうございます!助かりました