1 関数引数とポインタ

   1.1 ポインタによる引数渡し
 C言語において、関数の引数の受渡しは値呼び出し(call by value)です。そのため単純変数の場合、関数内での実行結果を引数として返す事はできず、結果は return 文を使って1つしか返すことができません。この問題を解決するためには、引数の受渡しにポインタを使うことです。これにより、実質的に参照呼び出し(call by reference)にすることができます。例えば2つの整数の和と差を引数に求める関数は以下の様になります (実引数としてアドレスを渡す仮引数はポインタ型でなければなりません)。
calc(data1, data2, &add, &diff);  /* 関数呼出し*/

void calc(int data1, int data2, int *add, int *diff){
  *add  = data1 + data2;
  *diff   = data1 - data2;
}
 このプログラムの場合 &add と &diff の値(すなわち add と diff のアドレス) が関数側に渡され、関数側では *add と *diff によりそれらの値をアドレスと見て data1 と data2 の和と差を代入しています。よって呼び出し側の add のアドレスに data1+data2 の値が、 diff のアドレスに data1-data2 の値がそれぞれ代入されます。


 これを以下の様にした場合には関数内のみで data1 と data2 の和と差が add と diff に代入されるだけで、その結果は呼び出し側には返りません。すなわち呼び出し側の add の値を格納しているメモリのアドレスと関数側の add のアドレスとは別のものとなります(名前が同じでも値の格納場所が異なります)。
calc(data1, data2, add, diff);  /* 関数呼出し */

void calc(int data1, int data2, int add, int diff){
  add  = data1 + data2;
  diff = data1 - data2;
}