アドレスによる呼び出しと参照による呼び出しの主な違いは、アドレスによる呼び出しでは、引数のアドレスが関数の正式なパラメータにコピーされるのに対し、参照による呼び出しでは、引数の参照が関数の正式なパラメータにコピーされることです。
一般に、関数とは、あるタスクを複数回実行することができるステートメントの集合です。
関数は、プログラムをより読みやすくするのに役立ちます。
C++などのプログラミング言語では、mainメソッドから実行が開始され、mainメソッドから他の関数やメソッドを呼び出すことが可能である。
これらの言語では、関数を呼び出すためのさまざまなメソッドが用意されている。
C++では、「アドレスによる呼び出し」と「参照による呼び出し」の2つがその方法です。
Call By Addressとは
Call By Addressは、Call By Pointersとも呼ばれる。
この方法では、プログラマは実際の引数のアドレスを正式なパラメータに渡します。
そして、関数はそのアドレスを使って実際の引数にアクセスします。
つまり、形式パラメータに加えられた変更は、実引数に影響する。
ポインタによる値の受け渡しは、他の値と同様に、引数ポインタを関数に渡す。
プログラム例を以下に示す。
メインプログラムには、a’とb’という2つの整数が存在する。
a’と’b’のアドレスは関数に渡されている。
つまり、関数はこれらのアドレスを取得する。
そして、temp変数が2つの値を入れ替えるのに役立っています。
そして、このアドレスを使って、関数が実際の値を操作する。
したがって,この関数の内部で行われた変更は,メインプログラムでも確認することができます.最後に、2つの値が交換されたことを確認します。
これで、aは20、bは10になりました。
Call By Referenceとは
参照呼び出しの概念を理解する前に、参照変数の概念を理解することが重要です。
次のようなコードを想定してください。
int a = 10;
int &b= a;
ここで、bは参照変数です。
この変数は、それ自身はメモリ空間を占有しません。
したがって、すでに割り当てられている変数のメモリを共有することになります。
プログラマが実際の変数を変更すると、参照変数も変更されます。
プログラマがaを変更すればbに反映され、bを変更すればaはその新しいbの値を使うことになる。
同様に、参照変数はメモリの節約に役立つ。
参照による呼び出しでは、引数の参照が正式なパラメータにコピーされる。
関数内部では、プログラマはその参照を用いて実際の引数にアクセスすることができます。
したがって、パラメータに加えられた変更は、実際の引数に影響します。
さらに、参照による値の受け渡しでは、他の値と同じように引数の参照が関数に渡されます。
図2:参照渡しを用いたC++プログラム
メインプログラムでは、2つの整数が存在する。
‘a’と’b’です。
この2つの値はswap関数に渡される。
swap関数では、pとqが正式なパラメータです。
また,&p と &q は参照変数であることを示している.そして、swap関数が値を変更する。
最後に、スワップされた値がコンソールに表示される。
アドレスによる呼び出しと参照による呼び出しの違い
定義
アドレスによる呼び出しとは、実引数のアドレスを形式パラメータにコピーして関数を呼び出す方法です。
しかし、参照による呼び出しは、引数の参照を正式なパラメータにコピーして関数に引数を渡す方法です。
したがって、これがCall By AddressとCall By Referenceの違いです。
機能性
さらに、Call By AddressとCall By Referenceのもう一つの違いは、その機能性です。
アドレスによる呼び出しでは、プログラマは実引数のアドレスを形式パラメータに渡すのに対し、参照による呼び出しでは、プログラマは実引数の参照を形式パラメータに渡します。
メモリ割り当て
また、アドレスによる呼び出しでは、実引数と形式パラメータの両方にメモリが確保されるのに対し、参照による呼び出しでは、実引数のみにメモリが確保され、形式パラメータはそのメモリを共有することになります。
結論
簡単に言うと、Call By AddressとCall By Referenceは、関数に値を渡す2つの方法です。
アドレスによる呼び出しと参照による呼び出しの主な違いは、アドレスによる呼び出しでは、引数のアドレスが関数の正式なパラメータにコピーされるのに対し、参照による呼び出しでは、引数の参照が関数の正式なパラメータにコピーされるという点です。