関数の引数としてのポインタ


Cの関数では、実引数の値が仮引数にコピーされます。つまり普通に実数を関数に引き渡す方法では、呼び出された側でいくらその値を書き換えても呼び出し側の値は変わりません。この、値そのものを仮引数から実引数に引き渡す方法を 「Call by value (値による呼び出し)」といいます。
   しかし、ポインタ変数を引数として使えば呼び出し側の値を呼び出された側から、間接的に変更できす。呼び出し側と呼び出される側にポインタ変数のアドレスを共有させるのです。関数を呼び出してから、このアドレスの内容を書きかえれば、呼び出し側の値を変更することができるのです。この値の格納されているアドレスを引き渡す方法を「Call by reference(参照による呼び出し)」といいます。

  これから、2つの整数を入れ替えるプログラムを作ってみます。
まず、call by value(値による引き渡し)でプログラムを作ってみます。

(例 1.5A)
                  # include stdio.h>
                  void swap (int , int)

                  main( )
                  {  
                        int a , b ;
                        printf("整数a , b の入力") ;
                        scanf("%d   %d ",&a, &b ) ;
                        swap( a , b );
                        printf("a = %d , b = %d \n", a ,b ) ;
                  }

                  void swap ( int a , int b ) ;
                  {
                        int temp ;
                        temp = a ;
                        a = b ;
                        b = temp ;
                  }                 

実行結果
               整数a 、bの入力      100   50
                a = 100 , b = 50

実行結果を見ると変数a 、bの値は入れ替わりませんでした。これは、実数 a 、b の値をそのままコピーして引き渡しているので、いくら swap()関数内でaとbを入れ替えてもmain関数内のa、bには影響がありません。

それでは、次にCall by reference(参照による呼び出し)でプログラムを作ってみましょう。

(例 1.5B)
                #include <stdio.h>
                void swap ( int * , int * )
               
                main()
                {
                     int a , b ;
                     printf(" 整数a 、bの入力”) ;
                     scanf(" %d  %d ",&a , &b) ;
                     swap (&a , &b) ;
                     printf ("a = %d , b = %d \n ", a , b ) ;
                }

               void swap ( int * a , int * b ) ;
                {
                     int temp ;
                     temp = * a ;
                     *a = * b ;
                     *b = temp ;
                 }

実行結果
             整数a ,b の入力     100  50
              a= 50 , b = 100

  今度は a と bの値がきちんと入れ替わりました。例 1.5Aからの変更点は次のようです。

アドレスで渡す。実引数を渡すときアドレス演算子&を付加
ポインタ型変数で受け取る。   (仮引数の変数にアスタリスク*を付加
*a 、 *b で操作   (代入時に変数a、bに*を付加

swap( )関数内の引数は、main( )関数内で宣言された変数 a 、b のアドレスを受け取っています。このため、swap( )ないからアドレスをたどることによりmain( )関数内の変数 a 、bの値を入れ替えることが出来たのです。


「基礎講座もくじへ」

「Q&Aもくじへ」

「つぎへ」