では、関数の引数としてのポインタ変数について説明します。
まずは関数のプロトタイプ宣言を書いてみます。
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)で完成できなかったプログラムを完成させましょう。