私たちがC言語で int score = 100;
のように変数を宣言するとき、その score
という変数はコンピュータのどこに、どのように保存されているのでしょうか?この謎を解く鍵が**「メモリ」と「アドレス」**です。
この記事では、プログラムの舞台裏で動いているメモリの役割と、変数がどのように管理されているのかを、実際のコードを通して探っていきます。
メモリとアドレスの役割
コンピュータにおけるメモリ(主記憶装置、RAM)は、プログラムやデータが一時的に置かれる**「作業スペース」**のようなものです。CPUが計算などを行う際、必要な情報をこのメモリから読み書きします。
この広大な作業スペースは、バイト単位で区切られた小さな箱がズラリと並んでいるイメージです。そして、それぞれの箱には「0x0001」「0x0002」といったように、場所を特定するためのユニークな番号が振られています。この番号がアドレスです。
変数とアドレスの関係
私たちがプログラムで int user_age;
のように変数を宣言すると、C言語は以下のようなことを行います。
int
型を格納するのに十分な大きさのメモリ領域(空いている箱)を探す。- その領域を
user_age
という名前で予約する。 user_age = 30;
のように値が代入されると、予約した領域にその値を書き込む。
つまり、user_age
という変数の名前は、私たちプログラマが分かりやすいように付けたラベルであり、コンピュータは内部的に「アドレス 0x7ffee...
にあるデータ」という形で認識しています。
変数のアドレスを覗いてみよう
C言語では、&
(アドレス演算子) を使うことで、変数が格納されているメモリアドレスを直接見ることができます。
以下のプログラムは、様々な型の変数を宣言し、それぞれの「値」「アドレス」「サイズ」を表示するものです。
#include <stdio.h>
int main(void) {
int user_age = 30;
char initial = 'A';
double price = 1980.50;
printf("--- 変数の値とアドレスを見てみよう ---\n\n");
// %p はポインタ(アドレス)を表示するための、現代的で正しい書式指定子です
printf("変数 user_age の情報\n");
printf(" 値: %d\n", user_age);
printf(" アドレス: %p\n", (void *)&user_age);
printf("\n");
printf("変数 initial の情報\n");
printf(" 値: %c\n", initial);
printf(" アドレス: %p\n", (void *)&initial);
printf("\n");
printf("変数 price の情報\n");
printf(" 値: %lf\n", price);
printf(" アドレス: %p\n", (void *)&price);
printf("\n");
printf("--- データ型ごとのサイズを見てみよう ---\n\n");
// sizeof演算子で、各データ型が何バイトのメモリを消費するか確認
printf("int 型のサイズ: %zu バイト\n", sizeof(int));
printf("char 型のサイズ: %zu バイト\n", sizeof(char));
printf("double 型のサイズ: %zu バイト\n", sizeof(double));
return 0;
}
実行結果(アドレスは環境により毎回異なります):
--- 変数の値とアドレスを見てみよう ---
変数 user_age の情報
値: 30
アドレス: 0x7ffee2a1aabc
変数 initial の情報
値: A
アドレス: 0x7ffee2a1aabf
変数 price の情報
値: 1980.500000
アドレス: 0x7ffee2a1aab0
--- データ型ごとのサイズを見てみよう ---
int 型のサイズ: 4 バイト
char 型のサイズ: 1 バイト
double 型のサイズ: 8 バイト
結果からわかること
- 各変数が異なるアドレスを持つ:
user_age
,initial
,price
は、それぞれメモリ上の別々の場所に格納されていることがわかります。 - データ型によってサイズが違う:
sizeof
の結果から、double
型は8バイトの大きな領域を、char
型は1バイトの小さな領域しか必要としないことがわかります。変数を宣言すると、このサイズ分のメモリが確保されるのです。
まとめ
- プログラムが使うデータは、メモリという作業スペースに一時的に保存される。
- メモリ上の各場所には、アドレスというユニークな番号が付いている。
- 変数を宣言すると、そのデータ型に必要なサイズのメモリ領域が確保され、変数名とアドレスが結びつけられる。
&
演算子を使うと、変数のアドレスを知ることができる。
このメモリとアドレスの概念は、C言語の強力な機能である「ポインタ」を理解するための基礎となります。変数を宣言するとき、その裏側で何が起きているのかをイメージできるようになることが、C言語マスターへの第一歩です。