値による呼び出しとアドレスによる呼び出しの主な違いは、値による呼び出しでは、実際のパラメータの値が関数の正式なパラメータにコピーされるのに対し、アドレスによる呼び出しでは、実際のパラメータのアドレスが関数の正式なパラメータにコピーされるという点です。
関数とは、あるタスクを複数回実行する文の集合です。
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を表示します。
このように、これは値による呼び出しです。
このとき、実際の値は変化しない。
しかし、その変化は関数の内部でしか反映されない。
アドレスによる呼び出しとは
コール・バイ・アドレスの別名は、コール・バイ・ポインターです。
アドレスによる呼び出しは、引数のアドレスを正式なパラメータにコピーします。
関数はそのアドレスを使って実際の値にアクセスします。
したがって、関数の内部で行われた変更は、元の値に反映されます。
以下はその例です。
図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は元の値を変えてしまう。