📌

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