*関数を使うときにポインタが必要になるのはなんで? プログラム例その一  [#nc2589cc]

#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 7行目 [#n8981c20]

#pre{{
     5	  int a, b;
     6
-->  7	  a = 7; b = 3;
     8	  hoge(a, b);
     9	  printf("%d %d\n", a, b);
}}

-変数aのためにメモリ上のある場所(例えば0x1000番地)が用意され,そこに7が格納される
-変数bの値も別の場所(0x1004番地)に格納される

&ref(pic01.png);
**step2 8行目 [#zf740095]

#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とbの値};,すなわち0x1000番地と0x1004番地の&color(Red){中身};を関数hoge()に渡す 

&ref(pic02.png);

**step3 12行目 [#uff6b7d7]

#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	}
}}

-関数hoge()は,main()から渡された値をx,yという変数として受け取る
-変数x,yのために新しい場所(例えば0x1230,0x1234番地)が用意され,そこに受け取った値が格納される

&ref(pic03.png);
**step4 14行目 [#ub239fb8]

#pre{{
    12	void hoge(int x, int y)
    13	{
--> 14	  y = x + y;
    15	  printf("%d %d\n", x, y);
    16	}
}}

-変数xの値と変数yの値を足したものを変数yに代入する

&ref(pic04.png);
**step5 15行目 [#wdddeb78]

#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	}
}}

-変数xとyの値が出力される


&ref(pic05.png);
**step6 9行目 [#r05ee21b]

#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()の世界に戻ってくる
-このとき,変数a,bの値,すなわち &color(Red){0x1000,0x1004 番地の中身は変化していない!};
-変数aとbの値が出力される 

&ref(pic05.png);

**step7 実行結果 [#tccc5524]

以上の実行の結果は

#pre{{
7 10   ← 15行目のprintf()の出力
7 3    ←  9行目のprintf()の出力
}}

となる.

この場合,&color(Red){関数hoge()が受け取った値をいくらいじっても,元の世界(main()の世界)には反映されない};.

[[もどる>Docs/ポインタの話#func1]]

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