値によるパスと参照によるパスの主な違いは、値によるパスでは、パラメータの値が別の変数にコピーされるのに対し、参照によるパスでは、実際のパラメータが関数に渡されることである。
コンピュータプログラムは、CPUにあるタスクを実行するように指示する命令の集合体です。
効率的で効果的なプログラムを書くために、プログラミングには様々なコンセプトがあります。
そのひとつが関数で、再利用可能なステートメントの集まりです。
すべての文を同じプログラムに書くのではなく、いくつかの関数に分割して、メインプログラムの中で呼び出すことが可能です。
それによって、プログラムの管理がしやすくなり、メンテナンスも容易になる。
このとき、関数を呼び出す方法は2つある。
それは、値渡しと参照渡しを使う方法です。
パス・バイ・バリューとは
値渡しでは、関数のパラメータの値がメモリの別の場所にコピーされます。
関数内で変数にアクセスしたり変更したりするときは、コピーされた値だけにアクセスします。
従って、元の値には影響がありません。
上図のプログラムでは、変数valueに整数の5が格納されている。
findNewValueは関数です。
valueはその関数に渡される。
関数内では、値がnewValueという新しいメモリ位置にコピーされます。
そして、この関数は整数を返します。
そして、この整数はメイン関数のnewValue変数に格納されます。
最後に、newValueはコンソールに表示されます。
この関数では、新しいメモリ位置にコピーされた値をnewValueと呼びます。
変更はそのnewValueに対して行われ、元の値には行われない。
この方法をPass by Valueと呼びます。
参照渡しとは
参照渡しでは、メモリアドレスがその関数に渡されます。
つまり、その関数は実際の変数にアクセスすることができる。
以下にその例を示します。
図2:参照渡しを用いたC言語プログラム
変数valueには整数の5が格納されている。
findNewValueは関数です。
メモリ位置valueのアドレスは、その関数に渡される。
したがって、この関数はこの値を取得する。
newValueはポインタです。
これは、valueという元のメモリロケーションを指しています。
この関数は、newValueが指す元の値に5を加算します。
そして、計算された値が返され、newValue変数に格納されます。
最後に、newValueがコンソールに表示されます。
このメソッドでは、メモリロケーションが関数に渡されます。
したがって、変更は元の値に対して行われます。
したがって、このメソッドはPass by Referenceと呼ばれます。
値による受け渡しと参照による受け渡しの違い
定義
値渡しとは、関数のパラメータ値を別の変数にコピーする仕組みを指し、参照渡しとは、実際のパラメータを関数に渡す仕組みを指します。
これが値渡し、参照渡しの主な違いです。
変更点
値渡しでは、関数内部での変更は元の値には反映されません。
一方、参照渡しでは、関数内部での変更は元の値に反映されます。
この点も、値による受け渡しと参照による受け渡しの違いと言えるでしょう。
実際のパラメータ
また、値渡しでは、実際のパラメータのコピーが作成されます。
一方、参照渡しの場合は、実際のパラメーターのアドレスが関数に渡されます。
機能との関連性
値による受け渡しと参照による受け渡しのもう一つの違いは、値による受け渡しでは、関数が実際の内容のコピーを取得するのに対し、参照による受け渡しでは、関数が元の変数の内容にアクセスする点です。
必要メモリ
また、値による受け渡しは参照渡しよりも多くのメモリを必要とします。
所要時間
時間要件は、値によるパスと参照によるパスのもう一つの違いです。
値渡しでは値をコピーするため時間がかかるのに対し、参照渡しではコピーしないため時間がかからない。
結論
値渡し」と「参照渡し」の主な違いは、「値渡し」ではパラメータの値が別の変数にコピーされるのに対し、「参照渡し」では実際のパラメータが関数に渡される点です。