最終更新日:2020年07月27日

実引数 #

関数呼び出しで言及する引数は、実引数と呼ばれるものです。 例えば、

func1(12, 23);

ここで1223は実引数である。

実引数は定数、変数、式などです。

12
func1(a, b); // here actual arguments are variablefunc1(a + b, b + a); // here actual arguments are expression

Formal Arguments #

関数定義で述べられる引数は formal arguments と呼ばれています。 正式な引数は、関数内のローカル変数と非常によく似ています。

1234
int factorial(int n){ // write logic here}

ここでnが形式引数である。

  1. 関数呼び出しの実引数の順序、数、および型は、関数の形式引数と一致しなければなりません。
  2. 実引数と形式引数の間に型の不一致がある場合、コンパイラは実引数の型を形式引数に変換しようとしますが、それが合法でなければ、ゴミ値が形式引数に渡されてしまいます。
  3. 形式引数で行われた変更は、実引数に影響しません。

次のプログラムは、この動作を示しています。

 1 2 3 4 5 6 7 8 910111213141516171819202122232425
#include<stdio.h>void func_1(int);int main(){ int x = 10; printf("Before function call\n"); printf("x = %d\n", x); func_1(x); printf("After function call\n"); printf("x = %d\n", x); // signal to operating system program ran fine return 0;}void func_1(int a){ a += 1; a++; printf("\na = %d\n\n", a);}

ここで変数xの値は関数 func_1() が呼ばれる前に 10 となっていますが、 func_1() が呼ばれた後も main() の中の x10 になっていることがわかります。 関数func_1()の内部で行われた変更は、xの値には影響しないのです。 これは、関数に値を渡すときに、値のコピーが作成され、そのコピーが形式引数に渡されるために起こる。 つまり、形式引数は元の値そのものではなく、元の値のコピーに対して働くので、func_1()の内部で行われた変更がmain()の内部に反映されないのはそのためです。 このプロセスはCall by Valueを使った引数の受け渡しとして知られており、この概念については次の章で詳しく説明します。

コメントを残す

メールアドレスが公開されることはありません。