第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
認証範囲 本社、芝大門オフィス品質方針