- ベストアンサー
値渡しと参照渡しについての質問
- 関数内で仮引数xとyの値を交換する処理を行っていても、これは変数num1とnum2の値を「コピー」した5と10を交換しているにすぎません。
- swap関数内で値を交換しても、呼び出し元の変数であるnum1とnum2に影響を与えることができません。
- 値渡しとは関数に引数として渡す値がコピーされることを指し、参照渡しは変数のメモリ上のアドレスが渡されることを指します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>値渡しとはどういうことでしょうか? >参照渡しとはどう違うのでしょうか? 値渡しは、ご質問のソースどおりです。 >swap(num1, num2); 通常の関数呼び出しは皆こちらで、num1・num2の「値」を「コピー」して関数を呼び出し、結果(返り値)をどこにも保存していませんから、swap(入れ替え)したいのであれば用をなしません。 そこで、参照(メモリアドレス)渡しの出番です。 swap関数定義は次のように書き、 void swap(int *x_ptr, int *y_ptr) { int tmp; tmp = *x_ptr; *x_ptr = *y_ptr; *y_ptr = tmp; } 呼び出しもこう変えます。 swap(&num1, &num2); &num1 と書くと、num1変数の値が格納されているメモリアドレスを意味します。 メモリアドレスを渡してやることで(これが「参照渡し」)、swap関数内ではnum1変数の実態にアクセスし(*x_ptr)、書き換えることができます。 アドレスを格納する型をポインタと言い、x_ptr, y_ptr がそれに当たります。 気をつけなければいけないのは、ポインタはメモリアドレスしか示していないので、そこにどんな型の値が保存されているか、きっちりプログラマが管理しなければならないことです。 また、普段は変数名に隠蔽されているメモリアドレスを直接扱いますので、うっかり変数アドレスでない値を渡してしまうと、予想外のメモリ領域を破壊したりして、非常に厄介で見つけづらいバグを発生させてしまいます。(関数を呼ぶときに、&をつけ忘れるだけで容易に起こりうる) 正直、普段のプログラミングではほとんど使いませんが、グローバル変数を用意しなくても、渡した変数や構造体の中身を直接いじることができるという便利な書き方です。(でもうっかりバグを仕込んでしまうデメリットが大きくてですね…。)
その他の回答 (2)
- AsarKingChang
- ベストアンサー率46% (3467/7474)
swap(num1, num2); → swap(&num1, &num2); void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ↑をまるごと void swap(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; } 何が違うのかは、調べみればわかると思いますよ。
お礼
回答ありがとうございます。
- Wap58
- ベストアンサー率33% (29/87)
値渡し:部下を信頼しない上司は重要な書類の元本を保存しコピーを部下に加工させます 参照渡し:部下を信頼してる上司は重要な書類の保管場所を部下に教え部下に加工させます
お礼
なるほどですね。 回答ありがとうございます。