\r\n\r\n
多くのプログラミング言語では、関数が使われています。関数は、特定のタスクを実行するステートメントの集合体です。メインコードはいくつかの関数に分割して呼び出すことができます。関数の呼び出し方法には、値による呼び出しと参照による呼び出しの2種類があります。コール・バイ・バリュー方式では、変数のコピーが関数に渡されます。関数の値が変更されても、元の値は変更されません。参照による呼び出しでは、関数内の変数の変更には元の値が反映されます。値による呼び出しと参照による呼び出しの主な違いは、値による呼び出しでは変数のコピーが関数に渡されるのに対し、参照による呼び出しでは変数のアドレスが関数に渡されることである。この記事では、コール・バイ・バリューとコール・バイ・リファレンスの違いについて説明します。
1. 概要と主な違い 2. バリューコールとは 3. リファレンスコールとは 4. バリューコールとリファレンスコールの類似点 5. 横並びの比較 - 表形式でのバリューコールとリファレンスコール 6. まとめ
値による呼び出しでは、変数のコピーが関数に渡されます。この関数はコピーされた値を変更することはできますが、元の値を変更することはできません。この考え方は、プログラムの中で2つの数値を交換することで簡単に理解することができます。コードブロック環境で書かれた次のCプログラムを参照してください。
図01:2つの数値の入れ替えの手順
下のプログラムでは、変数 a の値が 20、変数 b の値が 30 であり、swap (a, b) 関数を呼び出すと、この二つの値が swap 関数に渡される。swap関数では、'a'は'x'に、'b'は'y'にコピーされる。x」の値が20、「y」の値が30になったので、temp変数を使って2つの値を入れ替えてください。swap関数で'x'と'y'の値を出力すると、'x'が30、'y'が20となる。"スワップ機能 "が終了すると、制御はメイン機能に戻ります。a "と "b "の値をメイン関数で印刷すると、結果は元の値になります。 aは20点、bは30点です。スワップ機能で変更した内容は、メインプログラムには反映されません。
図02:交換プログラムの出力
swap関数の'x'と'y'の値は、30と20というように値が入れ替わっているが、この値はメインプログラムでは使用できない。x' と 'y' の値が入れ替わっても、それらは swap 関数のローカル変数であり、main 関数からアクセスすることはできない。この問題を回避するために、リファレンスコールを使用することができます。
この方法では,変数のアドレスが関数に送られます.
図03:ポインタを使った2つの数値の入れ替え
下記の例では、a の値が 20、b の値が 30 であるため、プログラマは swap (&a, &b) 関数を使用して、a と b のアドレスを送信することができます。"a "と "b "のコピーを渡すのではなく、"b "のアドレスを渡す。
図04:ポインターを使ったスワッププログラムの出力
交換では、アドレスが渡されるため、関数はポインタを使用し、これらはポインタによって格納されるべきです。関数内部では、アドレス "a "が "x "に、アドレス "b "が "y "にコピーされます。temp変数を使って、"x "と "y "の値を交換する。この参照メソッド呼び出しでは、swap関数内部の変更がメインプログラムに反映される。mainで'a'と'b'の値を印刷すると、入れ替わった値が表示されます。a'の出力は30、b'の出力は20になりました。関数が変数のアドレスを取るとき、関数内で行われた変更は元の値に影響します。
値による呼び出しと参照による呼び出しの比較 | |
コール・バイ・バリューでは、変数のコピーが関数に渡されるため、関数内での変更は元の値には反映されない。 | 参照呼び出しでは、変数のアドレスが関数に渡されるため、関数内部で変数に変更を加えると、元の値が変更されます。 |
数値補正 | |
値で呼び出された場合、元の値は変更されない。 | 参照による呼び出しでは、元の値が変更されている。 |
値による呼び出しと参照による呼び出しは、関数を呼び出す方法です。値による呼び出しと参照による呼び出しの違いは、値による呼び出しでは変数のコピーが関数に渡されるのに対して、参照による呼び出しでは変数のアドレスが関数に渡されることです。コール・バイ・バリューまたはコール・バイ・リファレンスの使用は、実行するタスクに依存する。
本記事のPDF版をダウンロードし、オフラインで使用する場合は、引用の指示に従ってください。価値による呼称と引用による呼称の違いについては、こちらからPDF版をダウンロードしてください。