2 複数の戻り値がある場合(参照渡し)

これは、ちょっと難しい。本当は2年生で学習するポインターを学ばないと、理解するこ とはできない。しかし、細かいことは気にしないで、データの受け渡しの記述方法だけ、 とりあえず憶えてください。ここでのデータの渡し方を参照渡し(call by reference)と 言う。

2.1 例 (データの入れ替え)

次のような、変数に格納されているデータを交換するプログラムを例にして、参照渡しを考える。 このような、プログラムでは実引数が2個必要で、戻り値も2個必要になる。今まで、学習 してきた方法だと2個のデータを返すことができない。これは、メイン関数とプログ ラマーが定義した関数でデータを記憶するメモリーがきっちり分けられて、戻り値が一つ しか返せないためである。

メイン関数とプログラマー定義の関数で同じメモリーにアクセスできれば、問題は解決す る。いろいろな方法があるが、ここでは後に示すプログラムで、参照渡しという技法を使 う。これにより、メモリーの状態が図2のようになる。プロ グラマー定義の関数とメイン関数が同じメモリーを使っているのである。そのため、プロ グラマー定義の関数で、メイン関数の変数の内容を書き換えることができるのである。

参照渡しを実現するためには、呼び出しもとの実引数に&をつけ、呼ばれる関数の 仮引数に*をつける。使い方については、プログラムを見て欲しい。

	#include <stdio.h>
	void swap(int *i, int *j);

	/*==============================================================*/
	/*   main function                                              */
	/*==============================================================*/
	int main(void){
	  int a, b;
	  char temp;

	  printf("a = ");
	  scanf("%d%c",&a, &temp);

	  printf("b = ");
	  scanf("%d%c",&b, &temp);
  
	  swap(&a, &b);               /* 関数呼び出し */

	  printf("a=%d  b=%d\n", a, b);

	  return 0;
	}


	/*==============================================================*/
	/*   データの入れ替え                                             */
	/*==============================================================*/
	void swap(int *i, int *j){
	  int temp;

	  temp = *i;
	  *i = *j;
	  *j = temp;

	}
図 2: データの参照渡しのメモリー内容。本当はちょっと違うが、ポインターを使 わないでの説明なので勘弁して欲しい。
\includegraphics[keepaspectratio, scale=1.0]{figure/call_by_reference.eps}

2.2 練習問題(参照渡し)

2.2.1 データの循環

次に示すように、データを循環させるプログラムを作成せよ。

2.2.2 三角関数の計算




ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年2月15日


no counter