変数と型: データの箱とサイズ
「型」とは「メモリサイズ」のことである。
変数
メモリ上の特定の場所(アドレス)とサイズを持つ領域。
初期化
変数を宣言した直後に有効な値を入れること。
sizeof
型のメモリサイズ(バイト数)を調べる演算子。
詳細解説
変数の正体
C言語における変数は、単なる「値を入れる箱」ではありません。 「メモリ上の特定の場所(アドレス)」と「そこから何バイト使うか(サイズ)」 を持つ領域のことです。
PythonやJavaScriptなどの動的型付け言語と異なり、C言語では
「型 = メモリサイズ」です。int
型と決めたら、そこには常に4バイト(環境による)分の領域が確保され、それ以外のものは入りません。
初期化の重要性
変数を宣言した直後(int a;)、その場所には何が入っているでしょうか?
答えは「ゴミ(不定値)」
です。前回そのメモリを使っていたプログラムの残骸が入っています。初期化せずに使おうとすると、予期せぬ巨大な数字が出てきたり、バグの原因になります。
基本型
// 1. 変数宣言(場所の確保)int age; // 4 bytes allocated (contains garbage!)
// 2. 初期化(値の代入)age = 20;
// 3. 宣言と初期化を同時に(推奨)int score = 100;double weight = 60.5;char grade = 'A';// 基本的な型とサイズ(環境依存あり)char c = 'A'; // 1 byte (-128 ~ 127)int i = 100; // 4 bytes (-21億 ~ +21億)double d = 3.14; // 8 bytes (巨大な実数)
// サイズを確認するprintf("int: %zu bytes\n", sizeof(int));実践テクニック
現代の標準: stdint.h
「int型は何ビットか?」という議論は、環境によって異なるため不毛です。現代のC言語(組み込みやプロフェッショナルな現場)では、サイズが明確な型を使います。
#include <stdint.h>
// 現場の標準: サイズ固定整数型// 「intが何バイトか」で悩まなくて済むint32_t price = 1000; // 必ず 32bit (4 bytes)uint8_t byte = 255; // 必ず 8bit (0~255)int64_t large = 90000; // 必ず 64bit (8 bytes)命名規則
Standard: C言語(特にLinux界隈)では、変数は スネークケース (
user_id, packet_size) が好まれます。キャメルケース (userId)
はあまり使いません。
演習課題
課題1: サイズ確認
sizeof演算子を使って、自分の環境での char, int, double のバイト数を表示してください。
課題2: オーバーフロー体験
char型(最大127)の変数に 128 を代入して表示してみてください。何が起きますか?
解答例を見る
-128 と表示されることが多いです。
ビット表現が 01111111 (127) から 10000000 になり、最上位ビットが1になったことで「負の数(2の補数)」として解釈されるためです。これをオーバーフローと呼びます。
合格ライン
型が「メモリサイズ」であることを理解している
変数を必ず初期化する習慣がついている
int32_t などの固定長整数型を知っている