サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>変数の値を交換
/* この項目の続編として、複数の値を返す関数があります。あわせて読んで見て下さい。
今日は、2つの変数の値を交換する関数を作ります。交換するということは、書き換えるということです。事実上、この関数は2つの値を返します。
変数は、メインルーチンで宣言されています。Cでは引数を使って関数にデータを渡します。即ち、スタックにデータを積んで、関数を呼び出します。従って、引数は値のコピーです。渡された関数の側では、この値を変更することはできません。変更する時には関数に引数としてポインタを渡します。
関数の名前をSwap( )とします。Swap( )は2つのint型のデータを入れ替えます。引数として二つのint型のポインタを取ります。ポインタによって、実際にデータの存在している場所にアクセスして、その値を書き換えることができます。
Swap( )のプロトタイプ宣言を見て見ましょう。2つのint型のポインタを取る時には、このように宣言します。
void Swap( int *x, int *y );
関数の中では次の処理が行われています。結果として、xとyの値が入れ替えられます。
メインルーチンの中のSwap( )の呼び出しで、Swap(&x, &y);としているのは、xとyのアドレスを渡しているからです。
二度目のSwap( )の呼び出しで、Swap(px, py);となっていて、&が付いていないのは、int *px, *py;とint型のポインタが宣言されているので、px, pyはアドレスを指しているからです。 */
#include <stdio.h> void Swap(int *x, int *y); void main(void); void Swap(int *x, int *y) { int work; /* 作業用 */ work = *x; /* xの値を一時保存 */ *x = *y; /* xの値をyの値に書き換える */ *y = work; /* yの値をxの値に書き換える */ } void main(void) { int x = 10, y = 20; /* int型の変数の宣言 */ int *px, *py; /* int型のポインタ宣言 */ px = &x; /* pxはxのアドレスを指す */ py = &y; /* pyはyのアドレスを指す */ printf(" 交換前: x = %d y = %d\n", x, y); Swap(&x, &y); /* アドレスを渡すので&が必要 */ printf(" 交換後: x = %d y = %d\n", x, y); Swap(px, py); /* px pyは ポインタなので& は不要 */ printf("再交換後: x = %d y = %d\n", x, y); } |
/* ソースプログラム中の次の2行を削除したらどうなるでしょう。
px = &x; // pxはxのアドレスを指す py = &y; // pyはyのアドレスを指す
二つのポインタはint *px, *py;の宣言で、メモリ上に割り付けされたに過ぎません。初期化されていないので、どのアドレスを指しているかはわかりません。この状態でSwap( )を呼び出すと、Swap( )はどこかのデータを書き換えます。どういう結果になるかは予測がつきません。最悪の場合、システムがクラッシュして暴走します。
ポインタを使うと、コンパクトで(短いコード)、効率の良い(速い実行速度)プログラムを書けますが、バグには要注意です。 */
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−