第10回 ポインタ演算子の使用例

[課題10-1]int型ポインターを使って四則演算をしよう.

[プログラム例10-1]


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: }

[結果10-1]

コンパイル・実行すると次のよう表示されます.
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@ 足立工科大学 工学部 情報通信工学科