サーチ…


前書き

このセクションの範囲は、呼び出し時に関数のパラメータがどうなるかについての理論と実装の違いを説明することです。

詳細には、パラメータは、関数呼び出しの前と関数の内部で変数として見ることができます。ここでは、これらの変数への可視的な動作とアクセス可能性は、それらを渡すメソッドによって異なります。

さらに、このトピックでは、関数呼び出し後の変数とそのそれぞれの値の再利用性についても説明します。

価値による呼びかけ

関数を呼び出すと、プログラムスタック上に新しい要素が作成されます。これには、関数に関するいくつかの情報と、パラメーターと戻り値のスペース(メモリー位置)も含まれています。

パラメータを関数に渡すときは、使用された変数(またはリテラル)の値が関数パラメータのメモリ位置にコピーされます。これは、同じ値を持つ2つのメモリ位置が存在することを意味します。関数の内部では、パラメータメモリの場所だけで作業します。

関数を終了すると、プログラムスタック上のメモリがポップ(削除)され、内部で使用されたパラメータのメモリ位置を含む関数呼び出しのすべてのデータが消去されます。したがって、関数内で変更された値は外部変数の値に影響しません。

int func(int f, int b) { 
  //new variables are created and values from the outside copied
  //f has a value of 0
  //inner_b has a value of 1
  f = 1;
  //f has a value of 1
  b = 2;
  //inner_b has a value of 2
  return f+b;
}

int main(void) {
  int a = 0;
  int b = 1; //outer_b
  int c;

  c = func(a,b);
  //the return value is copied to c
  
  //a has a value of 0
  //outer_b has a value of 1   <--- outer_b and inner_b are different variables
  //c has a value of 3
}

このコードでは、main関数内に変数を作成します。これらは割り当てられた値を取得します。関数を呼び出すと、 finner_b 2つの新しい変数が作成されます。ここで、 bは外部変数と名前を共有し、メモリ位置を共有しません。 a<->fb<->bは同じです。

次の図は、スタック上で何が起こっているのか、そしてバリバリb変更がないのかを表しています。グラフィックは完全に正確ではありませんが、例を強調しています。 関数呼び出し中のスタックの可視化

変数を渡すのではなく、これらの変数の値だけを渡すので、「値による呼び出し」と呼ばれます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow