こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

誤った関数に関する値渡しについて

こんにちは、まずはソースを記述します。
#include<iostream>
using namespace std;

//誤ったswap関数の宣言
void swap(int x, int y);

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 x, int y)
{
int tmp;

tmp = x;
x = y;
y = tmp;
}

>>関数内で仮引数xとyの値を交換する処理を行っていても、これは変数num1とnum2の値を「コピー」した5と10を交換しているにすぎません。
swap関数内で値を交換しても、呼び出し元の変数であるnum1とnum2に影響を与えることができません。
・・の文章の中から質問ですが値渡しとはどういうことでしょうか?
参照渡しとはどう違うのでしょうか?
ご教示お願いします。

投稿日時 - 2020-05-04 13:13:57

QNo.9744029

困ってます

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

>値渡しとはどういうことでしょうか?
>参照渡しとはどう違うのでしょうか?

値渡しは、ご質問のソースどおりです。
>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 がそれに当たります。

気をつけなければいけないのは、ポインタはメモリアドレスしか示していないので、そこにどんな型の値が保存されているか、きっちりプログラマが管理しなければならないことです。
また、普段は変数名に隠蔽されているメモリアドレスを直接扱いますので、うっかり変数アドレスでない値を渡してしまうと、予想外のメモリ領域を破壊したりして、非常に厄介で見つけづらいバグを発生させてしまいます。(関数を呼ぶときに、&をつけ忘れるだけで容易に起こりうる)

正直、普段のプログラミングではほとんど使いませんが、グローバル変数を用意しなくても、渡した変数や構造体の中身を直接いじることができるという便利な書き方です。(でもうっかりバグを仕込んでしまうデメリットが大きくてですね…。)

投稿日時 - 2020-05-04 14:40:59

お礼

なるほどですね。
回答ありがとうございます。

投稿日時 - 2020-05-04 15:23:38

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

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;
}
何が違うのかは、調べみればわかると思いますよ。

投稿日時 - 2020-05-04 14:28:58

お礼

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

投稿日時 - 2020-05-04 15:20:59

ANo.1

値渡し:部下を信頼しない上司は重要な書類の元本を保存しコピーを部下に加工させます

参照渡し:部下を信頼してる上司は重要な書類の保管場所を部下に教え部下に加工させます

投稿日時 - 2020-05-04 13:49:51