6.3データの受け渡し方法


  関数へのデータの渡し方は、値を渡す「call by value」という方法と、ポインタで渡す「call by reference」という方法があります。

<call by value>

    関数へのデータの受け渡し方法としてはもっとも一般的な方法です。呼び出し側から、呼び出された側の関数に「値」を渡す方法です。実引数で指定した変数や定数を仮引数にコピーして渡します。あくまで実引数をコピーしたものを、仮引数に渡すので呼び出された関数側でその値を操作しても呼び出し元の関数での値には影響ありません。

呼び出し側 呼び出された関数側
int a;
func() ;        /*  値を渡す  */
func(int a)     /*  実引数のコピーを受け取る */

    a=a+1 ;     /* 関数側の変数aが1加算される が
}                           呼び出し元の変数は変化しない      */

 


<call by reference>

   ポインタを使ってデータの「アドレス」を渡す方法です。
   変数の前に「&」を付けるとその変数のアドレスを表すことができます。また、アドレスに「*」を付けるとそのアドレスに格納された変数の内容を参照することができます。この機能を使うと簡単に変数のアドレスを渡し、呼び出された関数側でそのアドレスの内容を操作することができます。また、配列を渡す場合、C言語ではその配列名が配列の先頭アドレスを表すためそれを利用します。「call by value」が呼び出し側の値をコピーして渡す方法だと言いましたが、「call by reference」では、呼び出し側の値が入った入れ物(正確には入れ物のアドレス)を渡す方法だと考えて下さい。
   入れ物ごと渡す方法なので、呼び出された側の関数で変数を操作すると、呼び出し元の値も同じく変化します。

呼び出し側 呼び出された関数側
int a ;
func( &a ) ;    /*   アドレスを渡す */
func( int *a

     *a=*a+1 ;  /* 呼び出し側の変数aも1加算される  */
呼び出し側 呼び出された関数側
int a[10] ;
func( ) ;   /* アドレス(配列名)で渡す */
func( int a[ ] )
{
   a[3] = a[3] + 1
  /* 呼び出し側の配列aの要素3も1加算される */

a=15 と b=25 の和を求めるプログラムを2つの方法で作成します。

<call by value>

「値でデータを渡す」
main( )
{
    int a=15 , b=25 , c ;
    int add( ) ;
    c=add( a,b);                             /* 関数に値を渡すし、結果を受け取る */
    printf (" %d+%d=%d\n",a.b.c);
}

int add(int x, int y )             /* 実引数のコピーを受け取る */
{
    return(x+y);                   /*  returnで(x+y)の結果を呼び出し元に返す */
}

<call by reference>

「ポインタを使ってデータをを渡す」
main( )
{
    int a=15, b=25, c ;
    int add( ) ;
    add(&a,&b,&c) ;                       /* アドレスを渡す */
    printf("%d+%d=%d\n",a,b,c);
}

int add(int *x ,int *y ,int *z);
{
    *z = *x + *y ;                
/* アドレスの内容を操作 */
}  

 


「もくじへ」