質問: *source++) != '\0'); printf("%d\n",p); return p; } printf("%d\n",s1); scpy(s1,s2); printf("%d\n",s1); ```
回答: こんにちは。 C言語は全て値渡しです。scpy()のdest(sourceも)は呼び出し側のdestに設定されているアドレス値が「値渡し」されます。scpy内部のdestと呼び出し側のdestに設定されているアドレス値は異なるメモリに記録されています。 従って、scpy()内部のdestをインクリメントしても呼び出し側のdestはインクリメントされません。 > > 関数の初めに新しいポインタ変数に代入することに意味あるのでしょうか? > > > 強い意味はないと思います。呼び出し側のdestは変更されないですよって意味を明確にしたいと言う意図があるかも知れません。(あまりそのような使い方は見たことないですが。) > > また、このコードはバッファオーバーフローなど考慮されてないと思いますが > > (strcpyなどもそうですよね?)、 > > 基本的にC言語はパフォーマンス優先するから、例外処理をしないし、 > > 実装者が仕様を理解した上で気をつけて使えという思想でしょうか? > > > 全くその通りです。 C言語はプログラマーの注意力をトコトン消費しますので、個人的には可能であれば業務には使わない方がよいように思います。お勧めはC++です。(組み込み系では必ずしもそうとは限りませんが。)