【C言語ポインタ】アスタリスク(*)の違い

ポインタを学習する上でアスタリスク(*)(以降「*」)の使用方法が分からなかったので、そもそもの意味合いから調べてみた。

int n = 50;
int *p = &n;

「*」の意味、違い

まず、「*」は

  • ポインタ型としての「*」
  • 間接演算子としての「*」

のように、別々の意味があることがわかった。そのため、もちろん使用する箇所は異なる。

宣言時の 「*」(ポインタの宣言)

C
int *p = &n;

この *pint 型の値を指すポインタである」 ことを示している。

  • int *p;pint 型の値を指すポインタ
  • &nn のアドレス(int * 型)
  • p = &n; で、pn のアドレスを代入

この*「ポインタを宣言するための記号」であり、データを参照する意味ではない。

ポインタ型の代入

C
int *p = &n;

&nn のアドレスを取得する(型は int *)。

pint * 型のポインタ。

型を一致させて代入する

上記は型が一致し問題なく代入できる。


ではもし以下のようなコードだったらどうだろうか??

C
int p = &n;

答えは代入できない。なぜなら型が一致していないから。

pint型。

一方で&nint *

使用時の「*」間接演算子

C
printf("*p = %d\n", *p);

ここでの *ポインタが指すアドレスの値を取得する(間接参照) ために使われる。

  • pn のアドレスを保持している
  • *p「ポインタ p が指すアドレスの中身」 を取得する
  • n の値は 50 なので、*p50 になる

この *「ポインタが指すアドレスの値を取得する」 という意味。

まとめ

用途コード例意味
宣言時の *int *p = &n;pint 型のポインタn のアドレスを保持)
使用時の **p = 50;p が指すアドレスの値を取得・変更
  • 宣言時の *「ポインタ変数の宣言」 を意味する(int *p;pint 型のポインタとして定義)
  • 使用時の *「ポインタが指すアドレスの中身を取得・変更」 するために使う(*p = 100;p が指す変数の値を 100 に変更)

混乱しないために!重要なポイント

ポインタの宣言 (int *p;) に使う * は、間接演算子(*p)とは違う用途。

どちらもポインタに関連するが、使う場所で意味が違う。

ポインタの宣言時使用時*の意味をしっかり区別することが大切。

うさぎ
うさぎ

おつかれえええええ!!!