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

関数を使うときにポインタが必要になるのはなんで? プログラム例その二 [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 8行目(main()からhoge()へ) [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()に渡す
  • hoge()は,それらを変数x,yとして受け取る.
  • 普通の(ポインタではない)変数uに対して,&uはその変数が格納される番地を表す
  • ポインタ変数の場合(int *p;のように宣言された場合),
    • pには番地の情報が格納され,
    • *pはその番地の中身を表す

pic06.png

step2 12行目 [edit]

--> 12	void hoge(int x, int *y)
    13	{
    14	  *y = x + *y;
    15	  printf("%d %d\n", x, *y);
    16	}
  • 変数x,yのために新しい場所(0x1230,0x1234番地)が用意され,そこに受け取った値が格納される

pic07.png

step3 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の値が表す番地の中身とする
  • 変数yの値は0x1004だから,「変数yの値が表す番地」は0x1004

pic08.png

step4 15行目 [edit]

    12	void hoge(int x, int *y)
    13	{
    14	  *y = x + *y;
--> 15	  printf("%d %d\n", x, *y);
    16	}
  • 変数xと*yが出力される
  • 出力されるのは,0x1230番地の中身と,0x1004番地の中身

pic09.png

step5 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()の世界に戻ってくる
  • 変数bの値,すなわち0x1004番地の中身は関数hoge()によって変更されている
  • 変数aとbの値が出力される

pic09.png

step6 実行結果 [edit]

以上の実行の結果は

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

となる.関数hoge()がポインタとして番地を受け取った変数については,元の世界(main()の世界)の値が直接いじられることになる.

もどる


添付ファイル: filepic08.png 665件 [詳細] filepic09.png 661件 [詳細] filepic07.png 698件 [詳細] filepic06.png 695件 [詳細]

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