C言語の難関ポインタ
ポインタとは
他の変数のアドレス(メモリ上の場所)を内容とする変数。
宣言は「型名 + *変数名」で行います。
int hoge = 100;
int *p = &hoge;
printf("%d", *p); // 100
このコードでは、
変数 hoge のアドレスをポインタ変数 p に代入し、
p が hoge のアドレスを参照しているため、
*p で hoge の値を出力できます。
学んでいて感じた違和感
ポインタの説明を読んでいると、日本語的に「ん?」と思う表現がいくつかありました。
特にこの2つ:
「int型へのポインタ」
「pにhogeへのポインタを設定」
int型へのポインタ
最初に見たとき、
「int型へのポインタ」ってどういう意味?
“intに向かう矢印”?なんか日本語的にピンとこない…
と思いました。
色々調べてみたところ、これはつまり:
「pはint型の値がある場所を指している」
という意味らしいです。
個人的には、最初からこう書いてある方が分かりやすいです笑
「指す」という表現を使うことで、
「ポインタ=アドレスを持っていて、どこかを指している存在」
というイメージがしやすくなりました。
###「ポインタを設定」という表現
次に気になったのがこの表現。
int hoge = 42;
int *p = &hoge;
普通に考えると、
「pにhogeのアドレスを代入している」
で十分伝わると思うんですよね。
でも「ポインタを設定している」と言われると、
「設定?」と一瞬考えてしまう。
💡 実際にメモリのイメージを見てみる
メモリ上
──────────────────────
アドレス | 中身
─────────┼────────────────
0x1000 | 42 ← 変数 hoge の値
0x2000 | 0x1000 ← ポインタ p の値(hoge のアドレス)
──────────────────────
┌────────────┐
│ hoge │ 値: 42
│ @0x1000 │
└─────┬──────┘
▲
│(p がこのアドレスを指す)
│
┌─────┴──────┐
│ p │ 値: 0x1000(hogeのアドレス)
│ @0x2000 │
└────────────┘
解説
hoge → メモリの0x1000番地に「42」という値を持つ
p → メモリの0x2000番地に「0x1000(hogeのアドレス)」を保持
*p → pが指す先(アドレス0x1000)の値を参照 → 42が得られる
つまり:
p = &hoge; は「pという箱に、hogeの住所(アドレス)を書き込んだ」ということ。
「ポインタを設定した」という表現はつまり、
“pがどこを指すかを決めた(設定した)”
という比喩的な言い方なんですね。
まとめ
人によっては「pがhogeを指すようにした」という意味で
「ポインタを設定した」と言うこともあります。でも技術的には、
「アドレスを代入している」
という表現の方が正確で分かりやすい、と感じました。
int型へのポインタは初学者にはイメージしづらいなぁと思いました笑
引き続き勉強頑張ります!!
Discussion