*関数を使うときにポインタが必要になるのはなんで? プログラム例その二 [#yc2b731b]
#contents
こんどは以下のプログラム例を考えてみよう.
#pre{{
1 void hoge(int x, int *y);
2
3 main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
8 hoge(a, &b);
9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
**step1 8行目(main()からhoge()へ) [#z0eb5e78]
#pre{{
1 void hoge(int x, int *y);
2
3 main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
--> 8 hoge(a, &b);
9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
-main()は, &color(Red){変数aの値};と&color(Red){変数bの番地};, すなわち&color(Red){0x1000番地の中身};と&color(Red){0x1004という値};を関数hoge()に渡す
-hoge()は,それらを変数x,yとして受け取る.
-普通の(ポインタではない)変数uに対して,&uはその変数が格納される番地を表す
-ポインタ変数の場合(int *p;のように宣言された場合),
--pには番地の情報が格納され,
--*pはその番地の中身を表す
&ref(pic06.png);
**step2 12行目 [#m72132b5]
#pre{{
--> 12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
-変数x,yのために新しい場所(0x1230,0x1234番地)が用意され,そこに受け取った値が格納される
&ref(pic07.png);
**step3 14行目 [#ge0c5381]
#pre{{
12 void hoge(int x, int *y)
13 {
--> 14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
-変数xの値と&color(Red){変数yの値が表す番地の中身};を足したものを&color(Red){変数yの値が表す番地の中身};とする
-変数yの値は0x1004だから,「変数yの値が表す番地」は0x1004
&ref(pic08.png);
**step4 15行目 [#jdc3e0df]
#pre{{
12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
--> 15 printf("%d %d\n", x, *y);
16 }
}}
-変数xと&color(Red){*y};が出力される
-出力されるのは,0x1230番地の中身と,&color(Red){0x1004番地の中身};
&ref(pic09.png);
**step5 9行目 [#sd57a2a2]
#pre{{
1 void hoge(int x, int *y);
2
3 main()
4 {
5 int a, b;
6
7 a = 7; b = 3;
8 hoge(a, &b);
--> 9 printf("%d %d\n", a, b);
10 }
11
12 void hoge(int x, int *y)
13 {
14 *y = x + *y;
15 printf("%d %d\n", x, *y);
16 }
}}
-main()の世界に戻ってくる
-変数bの値,すなわち0x1004番地の中身は関数hoge()によって変更されている
-変数aとbの値が出力される
&ref(pic09.png);
**step6 実行結果 [#w2a7d906]
以上の実行の結果は
#pre{{
7 10 ← 15行目のprintf()の出力
7 10 ← 9行目のprintf()の出力
}}
となる.関数hoge()が&color(Red){ポインタとして番地を受け取った変数については,元の世界(main()の世界)の値が直接いじられる};ことになる.
[[もどる>Docs/ポインタの話#func2]]