01: #include <stdio.h>
02: void main(void){
03: int x=2, y=5, z=0, *p, *q;
04:
05: p = NULL;
06: q = &z;
07:
08: p = &x;
09: z = x * *p;
10: printf( "z=%d x=%d *p=%d\n", z, x, *p );
11:
12: p = &y;
13: z = x * *p;
14: printf( "z=%d x=%d *p=%d\n", z, x, *p );
15:
16: *p = 20;
17: *q = 30;
18: p = &x;
19: *p = 10;
20: printf( "x=%d y=%d z=%d\n", x, y, z );
21: getchar();
22: }
コンパイル・実行すると次のよう表示されます.
z=4 x=2 *p=2 ・・・・・①
z=10 x=2 *p=5 ・・・・・②
x=10 y=20 z=30 ・・・・・③
リターンキーを押すとプログラムは終了します.
なかなか難しいところですので,順を追って説明して行きましょう.
03: int x=2, y=5, z=0, *p, *q;
変数x,y,zをint型に宣言しそれぞれ初期化しています.また,変数p,qをint型を指すポインタに宣言しています.
05: p = NULL;
ポインタpにNULLを代入します.NULLは空のポインタで何も指すものがないことを意味します.NULLはヘッターファイルstdio.hで0とdefineされています.
06: q = &z;
ポインタqに変数zのアドレスを代入します.
08: p = &x;
ポインタpに変数xのアドレスを代入します.
09: z = x * *p;
変数xとポインタpの指す値の積をzに代入します.ポインタpには8行目で変数xのアドレスが代入されていますから,ポインタpの指す値は変数xと同じ2になります.つまりz=x*x;と等価となり変数zは4となります.
10: printf( "z=%d x=%d *p=%d\n",
z, x, *p );
変数z,xとポインタpの指す値を出力します.
画面出力: z=4 x=2 *p=2 ・・・・・①
12: p = &y;
ポインタpに変数yのアドレスを代入します.
13: z = x * *p;
変数xとポインタpの指す値の積をzに代入します.ポインタpには12行目で変数yのアドレスが代入されていますから,ポインタpの指す値は変数yと同じ5になります.つまりz=x*y;と等価となり変数zは10となります.
14: printf( "z=%d x=%d *p=%d\n", z, x, *p );
変数z,xとポインタpの指す値を出力します.
画面出力: z=10 x=2 *p=5 ・・・・・②
16: *p = 20;
ポインタpの指す値に20を代入します.ポインタpには,12行目で変数yのアドレスが代入されていますから,これはy=20;と等価になります.
17: *q = 30;
ポインタqの指す値に30を代入します.ポインタqには,6行目で変数zのアドレスが代入されていますから,これはz=30;と等価になります.
18: p = &x;
ポインタpに変数xのアドレスを代入します.
19: *p = 10;
ポインタpの指す値に10を代入します.ポインタpには,18行目で変数xのアドレスが代入されていますから,これはx=10;と等価になります.
20: printf( "x=%d y=%d z=%d\n", x, y, z );
変数x,y,zの値を表示します.
画面出力: x=10 y=20 z=30 ・・・・・③
注目してもらいたいのはプログラム9,13行目が同じz= x * *p;というコーディング(プログラム書き方)なのに,実際に実行しているのはz=x*x;とz=x*yであるという点です.同じことが16,19行目にもいえます.配列などで繰り返し計算を行うとき,ポインタを使うとコンパクトなわかりやすい(?)プログラミングができます.またポインタの変更および計算には,実際のコピーや移動を伴わない場合が多いので,計算速度の速いプログラミングができます.
このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.
2017,1 ssatoh@ 足立工科大学 工学部 情報通信工学科