値渡しと参照渡し【C言語】
C言語における値渡しと参照渡しの違いについて例を示す。おおざっばには次のように区別される。
値渡し:呼び出し元のローカル変数に影響を「与えない」
参照渡し:呼び出し元のローカル変数に影響を「与える」
値渡しの例
code:arg_value1.c
#include<stdio.h>
void func(int);
int main(void){
int a = 1; # (1)
printf("%d\n", a);
func(a); # (2)
printf("%d\n", a);
return 0;
}
void func(int a){ # (3)
a = -1; # (4)
return;
}
(2)func関数に対して、main関数のローカル変数に格納されている値の「1」を渡す。
(3)func関数は、引数「1」をfunc関数のローカル変数aに格納する。
(4)func関数はローカル変数aの値を「-1」で上書きする。
結果として、main関数のローカル変数a(1)は上書きされない。
code:実行結果
$ ./a.out
1
1
参照渡しの例
code:arg_ref1.c
#include<stdio.h>
void func(int *); # (1)
int main(void){
int a = 1; # (2)
printf("%d\n", a);
func(&a); # (3)
printf("%d\n", a);
return 0;
}
void func(int *a){ # (4)
*a = -1; # (5)
return;
}
(3)func関数に対して、main関数のローカル変数のアドレス「&a」を渡す。
(4)func関数はこれをfunc関数のローカル変数a(ポインタ型)に格納する。
(5)func関数は、ローカル変数aが指す領域に対して「-1」を上書きする。これを間接参照という。
結果として、main関数のローカル変数a(1)が上書きされる。
code:実行結果
$ ./a.out
1
-1