童貞のプログラミング

童貞の頭の中を垂れ流します。

C言語のポインタについて 2.ポインタで出てくる&と*はなに?

C言語のポインタについて2

 

1.そもそもポインタとは何か?
2.ポインタで出てくる&と*はなに?
3.宣言する型が違う場合どうなっているのか?
4.ポインタのポインタとは?

 

ネットでポインタを調べると、&と*のこの二つがクソほど出てきます。
けどこいつらが何なのかよくわからないまま進めるとポインタのポインタのところで躓きます。

なので、今回はポインタで出てくる&と*について考えます。


結論をいうと
&はアドレス演算子といい、アドレスを指します。
*は間接演算子といい、(指定したアドレスの)中の値を指します。
これだけです。

実際に見てみます。

f:id:SitimiMayo:20210105213100p:plain

普通の変数とポインタ変数を、*&を使って出力した場合

結果

f:id:SitimiMayo:20210105213113p:plain

テスト結果

/*出力*/                      →  結果
printf("%d\n",A);         →        1 
printf("%p\n",&A);      →        ox7ffd3993d5f4
printf("%p\n",A_p);     →        ox7ffd3993d5f4
printf("%p\n",*A_p);    →        1
printf("%p\n",&A_p);   →       ox7ffd3993d5f8

 

となりました。

ひとつづつ考えていきます。

1行目は普通の変数Aを指定しているので、Aに入っている値は1なので1が出力されます。

 

2行目は普通の変数Aの&(アドレス)を指定しています。

よってAのアドレス、今回ですとox7ffd3993d5f4が出力されます。

 

3行目はポインタ変数A_pの値を指定しています。

ポインタ変数A‗pは&Aを代入しています。

&Aは2行目で触れたとおり変数Aのアドレスなので今回はox7ffd3993d5f4という2行目と同じ値が入ります。

 

ここまではなんとなくわかりますが、次がすこしややこしいです

 

4行目はポインタ変数A‗pの*(アドレスの中の値)を指しています。ポインタ変数A‗pの中の値はox7ffd3993d5f4です。このアドレスの中の値を返します。

アドレスox7ffd3993d5f4に対応した変数は変数Aです。その変数Aの値は1となるのでポインタ変数*A‗pの値は1となります。

 

5行目はA‗pの&(アドレス)なので今までのアドレスとは全く違うox7ffd3993d5f8という値が出てきます。

 

一応まとめますと、

&↓

①指定した変数のアドレスを返す。

 

*↓

①ポインタ変数だと使える(普通の変数には使えない)

②指定したポインタ変数のアドレスに対応した変数の値を返す。

 

追記

2021年1月29日リンク先を追加しました。