最終更新日:2020年07月27日
実引数 #
関数呼び出しで言及する引数は、実引数と呼ばれるものです。 例えば、
func1(12, 23);
ここで12
と23
は実引数である。
実引数は定数、変数、式などです。
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 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()
の中の x
は 10
になっていることがわかります。 関数func_1()
の内部で行われた変更は、x
の値には影響しないのです。 これは、関数に値を渡すときに、値のコピーが作成され、そのコピーが形式引数に渡されるために起こる。 つまり、形式引数は元の値そのものではなく、元の値のコピーに対して働くので、func_1()
の内部で行われた変更がmain()
の内部に反映されないのはそのためです。 このプロセスはCall by Valueを使った引数の受け渡しとして知られており、この概念については次の章で詳しく説明します。