「ポインタ」がわからない

C言語のポインタがわからない」 そう友人に言われて、私は面倒だったのでとりあえず「メモリについての知識を深めろ」と言った。

ポインタ本というのがよくあるらしいが、私はそういったものを読んだことがない。私が読んだのは『プログラミング言語C』一冊だけだ。そんな私がポインタを理解できて私よりずっと賢い友人が理解できない、というのは私には理解できない。

C言語はメモリの管理をプログラマに委ねている

まず「C言語は比較的低水準な言語である」これを言葉だけでなくしっかりと理解すべきだ。比較的低水準であるが故に、プログラマはメモリを自在に操作できる。これは長所であり、短所である。C言語はメモリの管理をプログラマに委ねている。

ポインタはアドレスが格納できる変数である

次にメモリについて理解しなければいけない。i++ の意味など最後の最後でいいのだ。メモリはトランジスタコンデンサで電気をためておくだけの箱だ。この箱は「番号を振って並べてある」。ここで言う番号がアドレスであり、ポインタはこのアドレスを格納するものである。ポインタはアドレスが格納できる変数である。

ポインタは間接的な操作が可能

ポインタはアドレスを格納するものだが、通常の変数にはできないことができる。通常、変数を書いたとき、その式の値はその変数の中身になる。だから、ポインタを書くと、その式の値はアドレスになる。アドレスしか値としてでないと、アドレスしか操作できなくなる。これは不便だ。

ポインタは「変数の中身(アドレス)」が指す「中身」を操作できる。ポインタの中身の中身を操作できる。これが「『*』であらわされるポインタの中身の中身を参照する演算子」の存在する意味だ。ポインタは間接的な操作が可能だ。

なぜ「メモリについての知識を深めろ」と言ったのか

ポインタの基本は結局これだけのことであり、これと配列や、ポインタの配列などが組み合わさることで理解がしにくくなっているだけのことだ。メモリを少し理解するだけでC言語はずっと使いやすくなる。むしろ、メモリを理解せずにC言語を理解するというのは不可能に近い。

だから、私は「メモリについての知識を深めろ」と言ったのだ。

おわり。

間接アドレッシングという言葉が不適切な気がしたので修正