コール・バイ・バリューとコール・バイ・アドレスの違いとは?分かりやすく解説!

この記事には、アフィリエイト広告を利用しています。

スポンサーリンク


値による呼び出しとアドレスによる呼び出しの主な違いは、値による呼び出しでは、実際のパラメータの値が関数の正式なパラメータにコピーされるのに対し、アドレスによる呼び出しでは、実際のパラメータのアドレスが関数の正式なパラメータにコピーされるという点です。

関数とは、あるタスクを複数回実行する文の集合です。

mainメソッドの中に全てのプログラム文を書くのではなく、プログラムをいくつかの関数に分割し、必要な時に呼び出すことができます

また、これによりプログラムの再利用が可能になり、読みやすくなります

関数に関係する引数には、実引数と形式引数の2種類があります。

実引数は関数を呼び出す際に渡す値で、形式引数は関数を呼び出す際に値を受け取る関数内部の変数です。

C言語などのプログラミング言語で関数を呼び出す方法には、値による呼び出しとアドレスによる呼び出しの2つがあります。

スポンサーリンク

バリューコールとは

関数は、定義されたタスクを実行し、その答えを返します。

戻り値の型がvoidの場合は、タスクを実行し、値を返しません。

値による呼び出しでは、実際の引数は関数の形式パラメータにコピーされます。

関数は、実際の引数ではなく、形式パラメータにある値を使用します。

したがって、元の値が変わることはありません。

以下に例を示す。

上の例では、mainメソッドに’a’と’b’という2つの整数の値が存在する。

swap関数はこの2つの値を取得する。

関数内部では、aの値がxに、bの値がyにコピーされます。

関数内部では、temp変数がこの2つの値を交換するのに役立っています。

これで x は 20、y は 10 となります。

この関数を実行した後、制御はmain関数に戻されます。

a’と’b’を表示するときは、元の値、つまり、’a’は10、’b’は20を表示します。

このように、これは値による呼び出しです。

このとき、実際の値は変化しない。

しかし、その変化は関数の内部でしか反映されない。

アドレスによる呼び出しとは

コール・バイ・アドレスの別名は、コール・バイ・ポインターです。

アドレスによる呼び出しは、引数のアドレスを正式なパラメータにコピーします。

関数はそのアドレスを使って実際の値にアクセスします。

したがって、関数の内部で行われた変更は、元の値に反映されます。

以下はその例です。

Main Difference - Call by Value vs Call by Address 図2: アドレスによる呼び出しを行うプログラム

上の例では、メインプログラム中に「a」と「b」という2つの整数があります。

a’と’b’のアドレスは関数に渡される。

関数はこれらのアドレスを取得する。

temp変数が2つの値を交換するのに役立っています。

関数はこのアドレスを使って実際の値を操作するため、関数内部の変化がメインプログラムで見えるようになります。

したがって、実際のa,bの値が10と20であっても、aの値は20、bの値は10になります。

Valueによる呼び出しとAddressによる呼び出しの違い

定義

値による呼び出しは、引数の実際の値を関数の正式なパラメータにコピーして関数に引数を渡す方法であり、ポインタによる呼び出しは、引数のアドレスを関数の正式なパラメータにコピーして関数に引数を渡す方法です。

機能性

値による呼び出しでは、実際のパラメータの値が関数の正式なパラメータにコ ピーされます。

しかし、アドレスによる呼び出しでは、実際のパラメータのアドレスは、関数の正式なパラメータにコピーされます。

このように、call by valueとcall by addressの主な違いは、機能性です。

オリジナル値への影響

コール・バイ・バリューとコール・バイ・アドレスのもう一つの大きな違いは、元の値への影響です。

Call by valueは元の値に影響を与えないが、Call by addressは元の値に影響を与える。

結論

値による呼び出しとアドレスによる呼び出しの主な違いは、値による呼び出しでは、実際のパラメータの値が関数の正式なパラメータにコピーされるのに対し、アドレスによる呼び出しでは、実際のパラメータのアドレスが関数の正式なパラメータにコピーされることである

簡単に言うと、call by valueは元の値を変えないのに対し、call by addressは元の値を変えてしまう。

タイトルとURLをコピーしました