C言語入門|メモリと変数の正体

見えない場所で何が起きているのか

これまで私たちは、変数をとても自然なものとして使ってきました。

int score;
double total;

でも、ちょっと立ち止まって考えてみましょう。

変数って、実際には何者なんでしょう?
その正体は、どこに存在しているのでしょう?

この節では、C言語が裏側で行っている
メモリと変数の本当の関係を、やさしく解き明かしていきます。

メモリとは何か

メモリ(memory)は、コンピュータ内部で情報を一時的に記憶するための部品です。
ICチップとして実装されており、8GB や 16GB といった容量で表されます。

メモリをイメージで捉える

メモリは、次のように考えると分かりやすいです。

  • 1マス = 1バイト
  • 1バイト = 0 と 1 が8個並んだ情報
  • マスがずらっと並んだ 巨大な方眼紙
番地内容(イメージ)
0番地00001010
1番地11110101
2番地10111001

この「何番目のマスか」を示す番号を
アドレス(address/番地) と呼びます。

メモリと変数の関係

では、プログラムはこの巨大な方眼紙をどうやって使っているのでしょうか。

答えは、とてもシンプルです。

変数とは、メモリの一部に付けられた「名前」

なのです。

変数宣言の裏側で起きていること

たとえば、次の変数宣言を見てみましょう。

int count;

この1行を書いただけで、C言語とOSは裏で次のような処理を行います。

手順内容
空いているメモリ領域を探す
int型に必要なサイズ(4バイト)を確保
その番地を count という名前と結びつける

以後、
count = 10;
と書くたびに、
指定された番地に 10 が書き込まれる
という仕組みです。

変数操作の正体を整理する

私たちが普段書いているコードを、メモリ視点で見てみましょう。

操作実際に起きていること
変数宣言メモリ領域の確保
代入メモリへの書き込み
参照メモリからの読み出し

つまり、C言語の変数操作はすべて
メモリの読み書きの代行なのです。

サンプルプログラムで確認してみよう

次のプログラムは、数値を変数に保存して表示するだけのものです。

プロジェクト名:9-4-1 ソースファイル名: sample9-4-1.c

#include <stdio.h>

int main(void)
{
    int level;

    level = 3;
    printf("現在のレベルは %d です。\n", level);

    return 0;
}

使用している命令の解説

命令書式役割
intint 変数名整数型の変数を宣言する
=変数 = 値メモリに値を書き込む
printfprintf(書式, 値)値を文字列として表示
returnreturn 値main関数を終了する

この短いコードでも、
メモリ確保 → 書き込み → 読み出し
という流れが確実に行われています。

低水準の世界ではどうなるのか

ここまでの話は、あくまで 高水準な視点 です。

C言語は、

  • メモリの空き探し
  • 番地管理
  • サイズ計算

といった面倒な処理を
自動でやってくれています

しかし、低水準の世界では違います。

番地を自分で指定し、
どこに何を書くかをすべて把握する必要がある

それが、アセンブラの世界です。

OSによるメモリ領域の割り当て

さらに重要なのが、
プログラムごとのメモリ管理です。

通常、コンピュータでは複数のプログラムが同時に動作しています。

プログラム使用可能なメモリ番地
プログラムA8200〜9999
プログラムB12000〜13500

このように、OSは
起動時に安全なメモリ領域を割り当てる
役割を担っています。

プログラム内部のメモリ構成

割り当てられたメモリ領域の中も、さらに用途別に分かれています。

領域主な役割
スタック領域通常の変数・引数・戻り値
ヒープ領域動的に確保されるメモリ
静的領域定数・static変数

今は
「そんな区分があるんだな」
くらいで十分です。

大切なのは、

変数や配列を使うたびに、
プログラムは実際のメモリを操作している

という事実です。

まとめ:変数はメモリの代理人

最後に、この節の要点を整理しましょう。

観点ポイント
メモリ巨大な方眼紙
変数メモリに付けられた名前
代入メモリへの書き込み
参照メモリからの読み出し

私たちは
メモリを直接触っていないように見えて、
実は常に触っている

のです。

次の一歩へ

次の節では、
このメモリと深く結びついた存在――
ポインタ
について、いよいよ正面から向き合っていきます。

ここから先は、
C言語の核心部です。
一緒に、ゆっくり確実に理解を深めていきましょう。