- ベストアンサー
C言語のポインタにおける動作について
- C言語のポインタにおいて、ポインタ変数の動作について疑問があります。
- 質問のコードでは、DelHalfSpc() という関数の引数 str がループを抜けた後に正しい値を main() の変数 str に格納できるのか疑問です。
- 実際にコードを実行してみると、空白を削除した結果が main() の変数 str に反映されることがわかりました。これはどうしてなのでしょうか?
- みんなの回答 (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に変わっています。 (この書式は「今は」無理に使わない方がいいです。 ポインタが理解できてから使う方が、学習速度は上がります)
その他の回答 (1)
- AsarKingChang
- ベストアンサー率46% (3467/7474)
簡単です。 > printf("空白削除前:\"%s\"\n", str); > printf("空白削除後:\"%s\"\n", DelHalfSpc(str)); > printf("str も変化:\"%s\"\n", str); //なぜ正しい結果が表示されるのか? DelHalfSpcが書き換えたのは、strがさしている「先」 strという変数の値=つまりポインタは、一切変化してません。
補足
丁寧な回答まことにありがとうございます。 > そのローカル変数で指している先だけに変化を与えたが、 > strの加減算は、破棄されてます。 > 呼び出し元の値には一切影響はありません。 呼び出し元の値には一切影響がないのなら、なぜ main() で printf("str も変化:\"%s\"\n", str); としたとき、str は空白が削除された正しい値になるのでしょうか? つまり、 DelHalfSpc(str) = str となるのはなぜなのでしょうか?
お礼
丁寧な回答まことにありがとうございます。 頭が悪いので、もう少し解説をお願いいたします。 > そのローカル変数で指している先だけに変化を与えたが、 > strの加減算は、破棄されてます。 > 呼び出し元の値には一切影響はありません。 呼び出し元の値には一切影響がないのなら、なぜ main() で printf("str も変化:\"%s\"\n", str); としたとき、str は空白が削除された正しい値になるのでしょうか? つまり、 DelHalfSpc(str) = str となるのはなぜなのでしょうか?