駅のコインロッカーを思い浮かべてください。壁一面に扉が並び、どの扉にも「1番」「2番」「3番」と番号が振ってあります。荷物を預けたあとに覚えておくのは、中身ではなく番号だけ。番号さえ分かれば、いつでも取り出せます。
コンピュータのメモリも、まったく同じ作りをしています。第2部「メモリの洞窟」では、このロッカー群の中を歩いて回ります。

メモリは1バイトごとに番号が振られている
メモリは「1バイト(8ビット)」ごとに区切られ、その1区画ずつに通し番号が付いています。この番号をアドレス(番地)と呼びます。番地は0番から始まり、1つずつ増えながら、途切れることなく最後まで続きます。
大切な性質が2つあります。同じ番地は1つしかないこと、そして番地は必ず連続していることです。この2つのおかげで、コンピュータは「3000番地の中身をください」と言うだけで、探し回ることなく一発で目的のデータへたどり着けます。メモリが速いのは、この番地のしくみのおかげです。
番地は数値です。人間が見るときは16進数で 0x7ffd5a20 のように書きますが、中身はただの通し番号にすぎません。何億個ものロッカーが一列に並んでいる、と考えてください。8GBのメモリなら、ロッカーはおよそ86億個あります。
変数は、予約済みのロッカー
ここまで使ってきた変数の正体も、このロッカーの予約でした。
int score = 80;この1行でコンピュータは「int1個分の広さのロッカーを空けておき、そこに80を入れる。以後その場所を score と呼ぶ」という手配をします。
そのとおりです。名前はコンパイルの時点で番地に置きかえられ、出来上がった機械語のなかに score という文字はもう残っていません。名前は人間のための道具で、実行中の機械が見ているのは番地だけなのです。
型はロッカーの大きさと読み方を決める
型には2つの役目があります。1つはロッカーを何個使うか、もう1つは中身をどう読むかです。ふつうの環境では、char が1バイト、int が4バイト、double が8バイトを使います。
つまり int score; は、4つのロッカーをまとめて1つの箱として予約している、ということです。占領する番地も4つぶんなので、次の変数はその先に置かれます。sizeof 演算子を使えば、その型がロッカーを何個使うか自分で確かめられます。printf("%zu\n", sizeof(int)); と書けば、たいていの環境で 4 と表示されます。
読み方の指定も型の仕事です。ロッカーの中に入っているのは0と1の並びだけなので、型がなければデータはただのビットの列です。同じ4バイトでも、int として読むか float として読むかで、意味はまったく変わってしまいます。
なぜ番地の話から始めるのか
多くの人がつまずくポインタは、突きつめれば「番地を入れておく変数」でしかありません。ところが番地そのものに慣れないままポインタへ進むと、分からないものが2つ同時に来て混乱します。そこでこの教材では、トラック10をまるごと番地の話に使います。急がば回れです。
まとめ
メモリは1バイトごとに番地が振られたロッカー群です。変数はそのロッカーの予約で、型が大きさと読み方を決めます。ここで番地に慣れておけば、次のトラックのポインタは「番地を書いたメモ」として素直に受け取れます。