❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

ポインタを理解するコツ②

Q.
 int *x;

     


    *x = 10;
     (x = &num)
上記の違いを説明せよ


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の参照先の値にアクセスしている。
参照先の変数に(重要!)値を格納したり、閲覧したりすることができる。

ポインタ変数名に*が付いていないときは「ポインタ変数の値」という意味になり、アドレスを代入することができます。