★関数(ポインタ変数とアドレス渡し2)★


では、関数の引数としてのポインタ変数について説明します。

まずは関数のプロトタイプ宣言を書いてみます。

void func(int *p);
関数名 func
引 数 int型変数のアドレス
戻り値 なし

この関数は引数として変数のアドレスを受け取ります。

アドレスを受け取ることが出来れば「別の関数でも」間接的に元の変数の中身を変更可能になります。

関数の本体は↓のようにしてみます。

void func(int *p)
{
    *p = *p + 10;
}

関数本体の中で「*p」と書くと、渡されたアドレスの中身を指すことになります。

渡されたアドレスから、間接的に元の変数の値を10増やすプログラムです。

それでは、main関数も加えて全体を書いてみましょう。

<sample program 134-01>

#include <stdio.h>

void func(int *p);

int main(void)
{
    int value = 123;

    func(&value);

    printf("value = %d\n", value);

    return 0;
}

void func(int *p)
{
    *p = *p + 10;
}

<実行結果>

*p = 133
続行するには何かキーを押してください・・・

int value = 123;

この時点で、パソコンのメモリ上に変数valueの領域が確保され、初期値123がセットされます。
(アドレスは適当です)

        メモリ
       +--------+
002CFA9C番地  |        |
        +--------+
002CFAA0番地  |    123 | ← 変数value
       +--------+
002CFAA4番地 |        |
       +--------+

func(&value);

次に関数funcが呼び出され、変数valueのアドレスが渡されます。

関数funcでは、渡されたアドレスを受け取るため、ポインタ変数pを準備します。
(変数pのアドレスは今回は重要では無いので書きません)

 +--------------+
  |              | ← ポインタ変数p
  +--------------+

ここに変数valueのアドレスが入ります。

 +--------------+
  |     002CFAA0 | ← ポインタ変数p
  +--------------+

*p = *p + 10;

「*p」と書くことで間接的に変数valueの中身を指すことになりますので、このプログラムで変数valueの中身が10増えます。

関数funcはこれで終了し、ポインタ変数pも解放されます。


printf("value = %d\n", value);

main関数に戻って、valueの中身を表示すると「133」が表示されます。


このように、別の関数から元のデータを扱えるようにすることが出来るのが「ポインタ変数」と「アドレス渡し」という考え方になります。

次回は、関数(引数と戻り値について2)で完成できなかったプログラムを完成させましょう。


次へ

戻る

目次へ