第10章 C言語の関数2 ~ 外部変数とstatic変数の説明を含む ~
第8章で、皆さんは関数の作り方を習いましたね。
確かそのときには、関数に渡した変数を、関数の中で書き換えても、
呼び出し元の変数が書き換わることはないと説明しました。
しかし、場合によっては、関数の中で変数を書き換えたら、
呼び出し元の変数が書き換わって欲しい時もあると思います。
そんな時には、どうすればいいのでしょうか?まずは、次の記述を打ち込んでみてください。
-- リスト24 --
#include <stdio.h>
void swap(int x, int y);
void main() {
int x, y;
x = 90;
y = 120;
printf("x = %d y = %d\n", x, y);
swap(x, y);
printf("x = %d y = %d\n", x, y);
}
void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
プログラムの意図としては、どうも変数 x と変数 y の値を入れ替えたいようです。
しかし、実行結果の方は、そうはならなかったことだと思います。
関数に渡した変数を、関数の中で書き換えたら、
呼び出し元の変数が書き換わるようにしたい時には、
アドレスを使います。
変数のアドレスを関数に渡して、そのアドレスの値を直接書き換えるようにすればいいのです。
それでは、リスト24を次のように書き換えて見てください。
-- リスト24` --
#include <stdio.h>
/**
* 関数プロトタイプ宣言
*/
void swap(int *px, int *py);
void main() {
int x, y;
x = 90;
y = 120;
printf("x = %d y = %d\n", x, y);
swap(&x, &y);
printf("x = %d y = %d\n", x, y);
}
/**
* 一つ目の引数の値と、二つ目の引数の値を交換する
*/
void swap(int *px, int *py) {
int temp;
temp = *px;
*px = *py;
*py = temp;
}
上の図のように、アドレスを教えることによって、直接変数の中身を書き換えることができます。
これをC言語では、アドレス渡しと言います。
(注26)
次に、関数プロトタイプ宣言のところを見てください。int *px となってますね。
main 関数は、&x を渡してるのに、受け取る方は *px となっています。
これは、本来でしたら、当たり前のことです。変数 x のアドレスを渡してるのですから、
受け取る方もアドレスを入れるための変数、ポインタ変数を用意するべきなのです。
また、関数 swap の中で temp = *px; や、*py = temp; などの記述がありますが、
あまりピンとこないかもしれませんね。
しかし、よく思い出してみてください。
これは単に、整数型同士で代入をしているだけです。
このように、C言語ではほんの少し高度なプログラムを作ろうとすると、
ポインタを理解している必要があります。
できれば、ポインタについてだけは、よく復習しておいて欲しいものです。