値渡しと参照渡しの違い

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
疲労コンパイル

値渡しと参照渡しの違い

#1

投稿記事 by 疲労コンパイル » 7年前

こんばんは。

コード:

#include<iostream>
using namespace std;

//swap関数の宣言
void swap(int* px, int* py);

int main(){
   int num1 = 5;
   int num2 = 10;

  cout << "変数num1の値は" << num1 <<  "です。\n";
  cout << "変数num2の値は" << num2 << "です。\n";
  cout << "変数num1とnum2の値を好感します。\n";

 swap(&num1, &num2);

 cout << "変数num1の値は" << num1 << "です。\n";
 cout <<   "変数num2の値は << num2 << "です。\n";

 return 0;
}

//swap関数の定義
void swap(int* px, int* py)
{
 int tmp ;

 *tmp = *px;
 *px = *py;
 *py = tmp;

}
これは参照渡しの方なんですが、いまいち参照渡しと値渡しの違いが解りません。
なぜ値渡しでは、値の交換ができないのでしょうか?
よろしくお願いします。

だんごさん
記事: 273
登録日時: 12年前

Re: 値渡しと参照渡しの違い

#2

投稿記事 by だんごさん » 7年前

おおざっぱに言うと、値渡しはコピーを、参照渡しはデータが入っている住所(アドレス)を渡しているからです。
コピーをいくら変更してもコピー元は影響しません。これが値を交換しても影響しない理由です。
しかし参照渡しはアドレスを渡されて、その中身を変えるわけですから値交換が可能になります。

怒られそうな説明ですが分かりやすく言うとこんな感じでしょうか。
 Dango San

たいちう
記事: 418
登録日時: 13年前

Re: 値渡しと参照渡しの違い

#3

投稿記事 by たいちう » 7年前

まず、疲労コンパイルさんのお使いの言語はC++です。
C++には「参照」という機能がありますが、
このプログラムではそれを使っていないことを認識してください。
void swap(int& x, int& y) {} のように書けば、C++の「参照」となり、
これでも値の交換が可能です。

お使いの言語はC++ですので、まぎらわしい「参照」という言葉を避け、
「値渡し」と「アドレス渡し」という言葉を使って元の質問に回答します。
私の説明もおおざっぱです。

変数(num1)をメモ用紙と考えると、値渡しではメモ用紙のコピーを関数に渡していると考えられます。
関数の中でメモ用紙(コピー)を書き換えても、オリジナルのメモ用紙は変更されません。

アドレス渡しの場合、関数にメモ用紙のコピーを渡すのは同じですが、
「変数(num1)として使われているメモ用紙の保管場所」が書かれたメモ用紙がコピーされます。
関数の中では、受け取ったメモ用紙(コピー)に書かれた保管場所のメモ用紙を書き換えています。

疲労コンパイル

Re: 値渡しと参照渡しの違い

#4

投稿記事 by 疲労コンパイル » 7年前

なるほど、理屈は解りました。
後はもうちょっとプログラムの使い方解れば理解できそうです。

sadora3
記事: 175
登録日時: 11年前

Re: 値渡しと参照渡しの違い

#5

投稿記事 by sadora3 » 7年前

17行目と18行目と28行目が変です。
17行目には全角の空白が含まれているため、エラーです。
18行目はダブルクォーテーションマークの位置を間違えています。
28行目は、tmpがポインタ変数じゃないのに、間接演算子(*)がつけられています。

sadora3
記事: 175
登録日時: 11年前

Re: 値渡しと参照渡しの違い

#6

投稿記事 by sadora3 » 7年前

参照渡しと、値渡しの違いを図示してみました。
プログラム歴が短いので、間違っていたらすみません。

まずは、参照渡しの図示から。
http://upup.bz/j/my65885AeeYtZq0mxoxV6Ls.png
http://upup.bz/j/my65886YpNYtZq0mxoxV6Ls.png
http://upup.bz/j/my65887fIeYtZq0mxoxV6Ls.png

こっちは値渡しの図示
http://upup.bz/j/my65888wQIYtZq0mxoxV6Ls.png
http://upup.bz/j/my65889tnTYtZq0mxoxV6Ls.png
http://upup.bz/j/my65890aNrYtZq0mxoxV6Ls.png

疲労コンパイル

Re: 値渡しと参照渡しの違い

#7

投稿記事 by 疲労コンパイル » 7年前

回答ありがとうございます。

この前の章で勉強したことですが、アドレスと実体の値はいわゆるその分身みたいなもので、その実体が格納されているアドレスさえわかればそのアドレスの値を調べて変換してくれると思います。値渡しの方では、自分の値をコピーしているだけで実際にその値が格納されている場所(アドレス)が解らないと思います。(回答してくれた人の説明とほぼ同じかもですが・・)アドレス渡しだと、まずアドレスから交換しているのでアドレス=実体の値、つまり同じことなので関数のルールではこれが適切なのでしょうとそういう事ですかね?
あんまり自信ないなぁ・・。

ちょっと今日は、健康上の都合で病院行くので返信はそれからになってしまいます。
帰ってきたらまた返信します。

疲労コンパイル

Re: 値渡しと参照渡しの違い

#8

投稿記事 by 疲労コンパイル » 7年前

返信遅くなりました。
説明は難しいのですが、解りましたので解決でいいでしょうか?

疲労コンパイル

Re: 値渡しと参照渡しの違い

#9

投稿記事 by 疲労コンパイル » 7年前

皆様、回答の方ありがとうございました。
解決にしておきます、

閉鎖

“C言語何でも質問掲示板” へ戻る