Top / Docs / ポインタの話 / func1

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

以下のプログラムを実行したときには計算機の中でどんな処理が行われるのか見てみましょう.

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

     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番地)に格納される

pic01.png

step2 8行目 [edit]

     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の値,すなわち0x1000番地と0x1004番地の中身を関数hoge()に渡す

pic02.png

step3 12行目 [edit]

--> 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番地)が用意され,そこに受け取った値が格納される

pic03.png

step4 14行目 [edit]

    12	void hoge(int x, int y)
    13	{
--> 14	  y = x + y;
    15	  printf("%d %d\n", x, y);
    16	}
  • 変数xの値と変数yの値を足したものを変数yに代入する

pic04.png

step5 15行目 [edit]

     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の値が出力される

pic05.png

step6 9行目 [edit]

     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の値,すなわち 0x1000,0x1004 番地の中身は変化していない!
  • 変数aとbの値が出力される

pic05.png

step7 実行結果 [edit]

以上の実行の結果は

7 10   ← 15行目のprintf()の出力
7 3    ←  9行目のprintf()の出力

となる.

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

もどる


添付ファイル: filepic03.png 572件 [詳細] filepic02.png 600件 [詳細] filepic04.png 625件 [詳細] filepic01.png 650件 [詳細] filepic05.png 636件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-08-13 (水) 13:45:19 (1140d)