関数のこと1


Cの関数とFortranのサブルーチンとでは,引数の扱いがちょっと違うらしい. 例えば,よく言われる話だが,変数x,yの値を入れ替える関数を作る場合,

Fortranでは,

      subroutine swap(x,y)
      tmp=y
      y=x
      x=tmp
      return
      end
で済むものが,Cで,
void swap( double x, double y ){
  double tmp;
  tmp=y; y=x; x=tmp;
  return;
}
としても,x,yは入れ替わらない.Cの関数の引数には,数値が渡されるだけで, アドレスは渡されないので,呼ばれた関数はその引数の実体にアクセスできない からである.そんなわけで,Cで関数を使って変数の値を変更したいときには, 関数にポインタを渡さなくてはならないことになる.つまり,こういうことである.
void swap( double *x, double *y ){
  double tmp;
  tmp=*y; *y=*x; *x=tmp;
  return;
}
scanf( ) 関数みたいなもので,ポインタを介さないといけないのも そういう理由による.

ところが,C++ の場合,関数を使って変数の値を変更する手段として, 関数にポインタを渡す以外にもう一つ,参照を渡すという手段である. 参照だと,関数の引数がFortranと同じように,呼ばれた関数には 引数の値だけでなくアドレスもちゃんと渡される.

void swap( double &x, double &y ){
  double tmp;
  tmp=y; y=x; x=tmp;
  return;
}
というか,むしろFortranの関数は引数を参照で渡すようになっていると いうことなのではないか.つまり,Cの関数とFortranのサブルーチンとの引数の 扱いの違いというのは,引数を値で渡すか参照で渡すかの違いなのだろう.





戻る