*関数を使うときにポインタが必要になるのはなんで? プログラム例その二 [#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]]


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS