Cのポインターが分かりにくい理由

 

N88-BASICでもポインターと同じように

アドレスを扱うことができ、アセンブラも

当然アドレスを使用しますが、

Cのポインターの分かりにくさの原因を

解説します。(個人的意見です。)

 

#include <stdio.h>

void main(void)

{

int  a;  /* 整数型変数 a */

int* p;  /* (整数型変数のアドレス)を入れる変数 p */

 

a = 5;

p = &a;  /* aのアドレス(&a)をpに代入 */

    printf("%d\n, *p);  /* アドレスpの中身5が表示される */

}

 

pはアドレス(場所を表す数、番地)を入れる変数

*pはpに入っているアドレス(上記&a)の中身(上記aの内容)です。

 

アドレス 内容(1アドレスに1バイト入ります)16進表記です。

00000100 05 ← a(下位バイトから入ってますa = 00 00 00 05)

00000101 00                    int型を4バイト(32ビット)

00000102 00                    として説明しています

00000103 00

 

aは00000005

&aはaのアドレス00000100なので、

p = &aでpは00000100になります。

*pはアドレス00000100の中身00000005

になります。

 

Cでポインターpやqの宣言は、通常

int *p, *q;

と書きます。

*pや*qがint型であるという宣言です。

整数型ポインターpの中身*pは確かにint型

なので分からなくもないのですが、

アドレスを格納する変数であるポインター

の宣言に、アドレスの中身である*pが

出てくる所が混乱する原因だと思います。

 

なので、

int*を整数型ポインターの宣言だと思えば

分かりやすいかと思います。

int* p;

は、整数型ポインター pを作ると解釈します。

 

コンパイラーは空白を無視するので、

int *p; も int* p;もint*p;と同じです。

 

ただし、

int *p, *q; はpとqがポインターになりますが

int* p, q; は、int *p, q; と同じなので、

pはポインターでqは整数型になります。

 

よって、

int* p;

int* q;

というように、1行ずつ書きます。

こうすれば、ポインターの宣言に*pなどの

ポインターの中身が出て来ないので

分かりやすいかと思います。

int*が整数型へのポインター変数の宣言文

と思い込みましょう。

 

個人的に int  *p; は分かりにくいと思ったので、

int*  p; と書くようにしています。