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; と書くようにしています。