ポインタとは何か②
Q.
int *x;
*x = 10;
上記の違いを説明せよ
A
int *x; ポインタ変数定義
xがポインタである事を定義している
*x = 10; 間接参照演算子
ポインタの参照先の値にアクセスしている
参照先(ポインタが指している)変数の型がintである事を宣言している。
解説)(ポインタ理解の盲点)
int *x;(ポインタ変数宣言)のアスタリスクと、
*x = 10;のアスタリスクは全くの別物です!!!とても重要!!!
(私はこれを理解するのにとても時間がかかりました。)
int型以外でもポインタ変数宣言はできます。一般化すると下記のようになります
ポインタ変数宣言 (型 *ポインタ変数名)
ここでの型は,ポインタ変数が指す先に格納されているものの型を指定します。int *pの場合は,pが指す先に格納されているものがint型の値であるということを意味しています。p自体はint型ではなく,アドレスを格納するための特殊な型(ポインタ型と言います)であることに注意してください。つまり「int型の値を指すポインタ」のことを省略して,「int型へのポインタ」または「intポインタ」と呼ぶことがあります。
ここがポインタ理解の最大の盲点である。つまり
int *p と宣言したら
pはアドレスが入っている特殊な変数(ポインタ変数)になるということだ。
変数定義をした後、xはポインタ変数となる。
ポインタ変数とはアドレスを格納する変数の事である
ポインタ宣言しただけでは、
ポインタxどのアドレスの値を格納しているのかは、未定である。
なので初期化(この場合どこを指しているかを明示する事)が必要になる。
初期化にはアドレス演算子が必要で、
X = &p
のようにどのアドレスを参照(Xにpのアドレスが格納されている)しているかを示す事でポインタ変数の初期化ができる。
また参照先の変数の値が未定の場合、
char *x=“hfdoaiuhのようにして初期化する事も覚えておいてほしい。
*x = 10;
間接参照演算子
xの参照先の値にアクセスしている。
参照先の変数に(重要!)値を格納したり、閲覧したりすることができる。
ポインタ変数名に*が付いていないときは「ポインタ変数の値」という意味になり、アドレスを代入することができます。