ポインタを学習する上でアスタリスク(*)(以降「*」)の使用方法が分からなかったので、そもそもの意味合いから調べてみた。
int n = 50; int *p = &n;
もくじ
「*」の意味、違い
まず、「*」は
- ポインタ型としての「*」
- 間接演算子としての「*」
のように、別々の意味があることがわかった。そのため、もちろん使用する箇所は異なる。
宣言時の 「*」(ポインタの宣言)
C
int *p = &n;
この *
は 「p
は int
型の値を指すポインタである」 ことを示している。
int *p;
→p
はint
型の値を指すポインタ&n
はn
のアドレス(int *
型)p = &n;
で、p
にn
のアドレスを代入
この*
は「ポインタを宣言するための記号」であり、データを参照する意味ではない。
ポインタ型の代入
C
int *p = &n;
&n
は n
のアドレスを取得する(型は int *
)。
p
は int *
型のポインタ。
型を一致させて代入する
上記は型が一致し問題なく代入できる。
ではもし以下のようなコードだったらどうだろうか??
C
int p = &n;
答えは代入できない。なぜなら型が一致していないから。
p
はint
型。
一方で&n
はint *
型
使用時の「*
」間接演算子
C
printf("*p = %d\n", *p);
ここでの *
は ポインタが指すアドレスの値を取得する(間接参照) ために使われる。
p
はn
のアドレスを保持している*p
は 「ポインタp
が指すアドレスの中身」 を取得するn
の値は50
なので、*p
は50
になる
この *
は 「ポインタが指すアドレスの値を取得する」 という意味。
まとめ
用途 | コード例 | 意味 |
---|---|---|
宣言時の * | int *p = &n; | p は int 型のポインタ(n のアドレスを保持) |
使用時の * | *p = 50; | p が指すアドレスの値を取得・変更 |
- 宣言時の
*
→「ポインタ変数の宣言」 を意味する(int *p;
はp
をint
型のポインタとして定義) - 使用時の
*
→「ポインタが指すアドレスの中身を取得・変更」 するために使う(*p = 100;
はp
が指す変数の値を100
に変更)
混乱しないために!重要なポイント
ポインタの宣言 (int *p;)
に使う * は、間接演算子(*p)
とは違う用途。
どちらもポインタに関連するが、使う場所で意味が違う。
ポインタの宣言時と使用時で *
の意味をしっかり区別することが大切。
うさぎ
おつかれえええええ!!!