メインコンテンツへ
アルゴリズムとプログラミングポインタの概念

C言語において、整数変数 x のアドレスが 0x1000 であり、x の値が 42 であるとする。ポインタ変数 p を `int *p = &x;` と宣言したとき、`*p` の値と `p` の値の組合せとして正しいものはどれか。

ア.*p = 0x1000、p = 42
イ.*p = 42、p = 42
ウ.*p = 0x1000、p = 0x1000
エ.*p = 42、p = 0x1000正解

解説

ポインタは「住所が書かれた手紙」のようなもの。p という手紙には「住所 0x1000 番地」が書いてある(p=0x1000)。その住所に実際に行ってみると(*p でアクセスすると)、そこには 42 という値が住んでいる(*p=42)。

なぜ エ が正解か

`p = &x` は「x のアドレス(0x1000)を p に格納する」という代入。したがって p の値は 0x1000(アドレス)となる。`*p` は「p が指すアドレス(0x1000)にある値を参照する」間接参照であり、x の値である 42 となる。よって *p=42、p=0x1000 が正しい。

なぜ ア は間違いか

p と *p の役割が逆になっている。p はアドレスを保持し(0x1000)、*p はそのアドレスの値(42)を示す。ポインタと間接参照の関係を逆に覚えた誤り。

なぜ イ は間違いか

p が 42 になることはない。p には `&x` すなわち x のアドレス(0x1000)が入る。値とアドレスを混同した誤り。

なぜ ウ は間違いか

*p が 0x1000 になるのは「p がアドレス 0x1000 を指し、そのアドレスにさらに 0x1000 というアドレス値が格納されている」場合のみ。通常の整数変数 x の値は 42 であり、0x1000 ではない。

出典: AI生成問題(学習用)