• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のポインタにの動作について)

C言語のポインタにおける動作について

このQ&Aのポイント
  • C言語のポインタにおいて、ポインタ変数の動作について疑問があります。
  • 質問のコードでは、DelHalfSpc() という関数の引数 str がループを抜けた後に正しい値を main() の変数 str に格納できるのか疑問です。
  • 実際にコードを実行してみると、空白を削除した結果が main() の変数 str に反映されることがわかりました。これはどうしてなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

char *DelHalfSpc(char *str) このときの、char *str部分は、ローカル変数といって、 関数を抜ける時、破棄されるということを、 最初に習ったとは思います。 そのローカル変数で指している先だけに変化を与えたが、 strの加減算は、破棄されてます。 呼び出し元の値には一切影響はありません。 なので、 void sub(int a) { a++; } void main(void) { int a=50; sub(a); これを何千回実行しようが、 printf("%d",a); これは50です。 } -- 例外もあります。「参照渡し」について sub(&a); この場合は、 aの指しているものではなく、 aという変数がある場所を渡します。 なので、受け取り側でaの内容を変更することが可能です。 sub(int *waaa) { 前回教えた通り関数のパラメタ名は何でもいいのです。 *waaa=51; ポインタ変数waaaの「中身」を書き換えろの書式 } この場合、戻ってきたら、aも51に変わっています。 (この書式は「今は」無理に使わない方がいいです。  ポインタが理解できてから使う方が、学習速度は上がります)

musume12
質問者

お礼

 丁寧な回答まことにありがとうございます。  頭が悪いので、もう少し解説をお願いいたします。 > そのローカル変数で指している先だけに変化を与えたが、 > strの加減算は、破棄されてます。 > 呼び出し元の値には一切影響はありません。  呼び出し元の値には一切影響がないのなら、なぜ main() で   printf("str も変化:\"%s\"\n", str); としたとき、str は空白が削除された正しい値になるのでしょうか?  つまり、   DelHalfSpc(str) = str となるのはなぜなのでしょうか?

その他の回答 (1)

回答No.1

簡単です。 >  printf("空白削除前:\"%s\"\n", str); >  printf("空白削除後:\"%s\"\n", DelHalfSpc(str)); >  printf("str も変化:\"%s\"\n", str); //なぜ正しい結果が表示されるのか? DelHalfSpcが書き換えたのは、strがさしている「先」 strという変数の値=つまりポインタは、一切変化してません。

musume12
質問者

補足

 丁寧な回答まことにありがとうございます。 > そのローカル変数で指している先だけに変化を与えたが、 > strの加減算は、破棄されてます。 > 呼び出し元の値には一切影響はありません。  呼び出し元の値には一切影響がないのなら、なぜ main() で   printf("str も変化:\"%s\"\n", str); としたとき、str は空白が削除された正しい値になるのでしょうか?  つまり、   DelHalfSpc(str) = str となるのはなぜなのでしょうか?

関連するQ&A

専門家に質問してみよう