関数のこと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のサブルーチンとの引数の 扱いの違いというのは,引数を値で渡すか参照で渡すかの違いなのだろう. |