データの受け渡しに、以下の2つの方法を学習した。
次節では、実際のプログラムを通して、これらのデータの渡し方の違いを考える。
リスト1に値渡しのプログラム例を示す。関数swapで a とbのデータを入れ替えようとしているが、それは不可能である。理由は、 図1に示すプログラム実行状態のメモリーの様子を見て ほしい。
1 #include <stdio.h> 2 void swap(int a, int b); 3 4 /*===============================================*/ 5 /* main 関数 */ 6 /*===============================================*/ 7 int main(void){ 8 9 int a,b; 10 11 a=1; 12 b=2; 13 14 swap(a, b); 15 16 printf("a=%d\tb=%d\n", a, b); 17 18 return 0; 19 } 20 21 /*===============================================*/ 22 /* swap 関数(値渡し) */ 23 /*===============================================*/ 24 void swap(int a, int b){ 25 int temp; 26 27 temp=a; 28 a=b; 29 b=temp; 30 31 }
a=1 b=2
リスト2にアドレス渡しのプログラム例を示す。先ほどの値 渡しと異なり、関数swapでaとbのデータを入れ替えができている。デー タが入れ替えられた理由は、図2に示すプログラム実 行状態のメモリーの様子を見て考えて欲しい。
1 #include <stdio.h> 2 void swap(int *a, int *b); 3 4 /*===============================================*/ 5 /* main 関数 */ 6 /*===============================================*/ 7 int main(void){ 8 9 int a,b; 10 11 a=1; 12 b=2; 13 14 swap(&a, &b); 15 16 printf("a=%d\tb=%d\n", a, b); 17 18 return 0; 19 } 20 21 /*===============================================*/ 22 /* swap 関数(アドレス渡し) */ 23 /*===============================================*/ 24 void swap(int *a, int *b){ 25 int temp; 26 27 temp=*a; 28 *a=*b; 29 *b=temp; 30 31 }
a=2 b=1
一方、アドレス渡しの場合、呼び出し側の変数のアドレスが渡される。そのため、呼び出
し側で呼び出し元の変数の値を書き換えることができる。