【課題4−5 関数に値を渡す】
<関数に値を渡す>
関数を呼び出すときには,呼び出し元は実引数を使って関数に値をたわし,関数はそれを仮引数で受け取る.関数へは値が引き渡されるのであって,実引数の名前と仮引数の名前が同じであっても異なっていても関係ない.
<関数にアドレスを渡す>
関数に値ではなく,値が格納されているアドレスを渡すことによって...
1)関数から呼び出し元の配列を参照することができる
(例)//呼び出しもと
long
price[5]={100, 150, 200, 210, 500};
long total;
...
total =
get_total(price, n); //配列のアドレスと要素数を渡す
//関数側
long
get_total(long *p, int n)//ポインタで受け取る
{ long total;
...
total
+= *(p++);
...
}
2)関数側から呼び出し元で用意した領域の書き換えが可能(課題4−6)
<const型修飾子>
関数に渡したアドレスの中身が関数側で書き換えられないようにするための修飾子.
(例) long
get_total(const long *p, int n)
この場合get_total関数内でpが指す配列に書き込む処理を記述するとコンパイルエラーが出る.
<値渡しとアドレス渡し>
値渡し
長所:実引数と仮引数がメモリ上で別々に確保されるので,関数側に値を変更されることがなく,安全.
短所:一度に多くの値を関数に渡すには,値の個数分引数を記述する必要がある.
アドレス渡し
長所:一度に多くの値を関数に渡すには,値を配列に格納してそのアドレスを渡すだけですむ.
短所:ポインタを使って値の格納されている領域を関数側が参照するので,値を関数に変更される可能性がある.(逆に,変更できるのが長所ともいえる)