第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言語ではほんの少し高度なプログラムを作ろうとすると、 ポインタを理解している必要があります。 できれば、ポインタについてだけは、よく復習しておいて欲しいものです。
< 前のページへ 次のページへ >-
IS 559680 / ISO27001
認証範囲 本社情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社品質方針







