第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言語ではほんの少し高度なプログラムを作ろうとすると、 ポインタを理解している必要があります。 できれば、ポインタについてだけは、よく復習しておいて欲しいものです。

< 前のページへ

Pagetop