値渡しと参照渡しについて個人的にまとめたメモ。
変数の値か、その変数が格納されているメモリ上のアドレスかを区別するために「値渡し」と「参照渡し」と言ってるのに、
『メモリ上のアドレスも数字、すなわち値じゃん!だから参照じゃなくて、値を渡してるんだ!実際は、参照渡しじゃなくて値渡しだ!』
という意見を見たので、これを書いています。
値と参照の違い
上記のエクセルの例で言うと、「address」が値で「E2」が参照にあたる。
「address」も「E2」も値であることに変わりないが、それを両方共「値」と表現してしまったら、箱の中身を指しているのか箱の場所を指しているのか分からなくなる。
値に参照が入ることもある
ややこしいことに箱の中身に箱の場所を指定する値(すなわち「参照」)が入っているパターンがある。
そういう意味では参照渡しも値渡しである、という意見も正しくはある。
上記の状態の時、「E2」の値は「B2」だが
その「B2」を値でななく参照として解釈すると
「E2」から「2017年04月19日」という値にたどり着くことができる。
この時、「E2」の値は参照となる。
上記をC++で表現
#include <iostream>
using namespace std;
int main()
{
string b2 = "2017年04月19日";
string& e2 = b2;
cout << e2 << endl;
return 0;
}
変数e2
は変数b2
の参照を格納するための変数であると宣言している。
よって、e2
を出力しているが、出力結果はb2
の中身である「2017年04月19日」となる。