サイトマップ / C言語講座出入り口総目次目次:ポインタ>変数の値を交換

青い直線

変数の値を交換

青い直線

[大文字小文字変換]←このソース→[単純選択ソート]

/* この項目の続編として、複数の値を返す関数があります。あわせて読んで見て下さい。

ソースプログラムの説明

今日は、2つの変数の値を交換する関数を作ります。交換するということは、書き換えるということです。事実上、この関数は2つの値を返します。

変数は、メインルーチンで宣言されています。Cでは引数を使って関数にデータを渡します。即ち、スタックにデータを積んで、関数を呼び出します。従って、引数は値のコピーです。渡された関数の側では、この値を変更することはできません。変更する時には関数に引数としてポインタを渡します。

関数の名前をSwap( )とします。Swap( )は2つのint型のデータを入れ替えます。引数として二つのint型のポインタを取ります。ポインタによって、実際にデータの存在している場所にアクセスして、その値を書き換えることができます

Swap( )のプロトタイプ宣言を見て見ましょう。2つのint型のポインタを取る時には、このように宣言します。

    void Swap( int *x, int *y );

関数の中では次の処理が行われています。結果として、xとyの値が入れ替えられます。

  1. ポインタxの指しているデータをworkに保存
  2. ポインタxの指しているアドレスにポインタyの指しているデータを上書き
  3. ポインタyの指しているアドレスにworkに保存しておいたデータを上書き

メインルーチンの中の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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>変数の値を交換