これは、ちょっと難しい。本当は2年生で学習するポインターを学ばないと、理解するこ
とはできない。しかし、細かいことは気にしないで、データの受け渡しの記述方法だけ、
とりあえず憶えてください。ここでのデータの渡し方を参照渡し(call by reference)と
言う。
次のような、変数に格納されているデータを交換するプログラムを例にして、参照渡しを考える。
- 2つの整数をキーボードから読み込み、それぞれを変数aとbに格納する。
- aとbの値を入れ替える。ここで、値を入れ替える専用の関数swap()
を使う。
- 入れ替えられた値を表示する。
このような、プログラムでは実引数が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:
データの参照渡しのメモリー内容。本当はちょっと違うが、ポインターを使
わないでの説明なので勘弁して欲しい。
|
次に示すように、データを循環させるプログラムを作成せよ。
- 3つの整数を読み込み、それぞれをa,b,cに格納せよ。
- a
b、b
c、
c
aとデータを循環させる。これには、関数を用いよ。
- 循環した結果を画面に書き出せ。
- キーボードから、角度を読み込む。単位は、度(degree)とする。
- プログラマー定義の関数を作成する。引数で角度を渡してもらい、
と
を計算する。これを一つの関数で実現すること。
- 科学の世界では角度はすべて弧度法をつかう。その単位はラジアン
(radian)で、ラジアンが180度である。
- 三角関数の値を計算する関数の呼び出しは、関数名(角度, sinの計
算結果, cosの結果)とすれば良い。
- ここでは、数学関数を使うので、本日の復習で述べた注意が必要である。
- 計算結果を表示する。
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年2月15日