データの受け渡しに、以下の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
一方、アドレス渡しの場合、呼び出し側の変数のアドレスが渡される。そのため、呼び出
し側で呼び出し元の変数の値を書き換えることができる。