変数は箱だと言ってきました。ここでは、その箱の大きさをバイト単位で測る方法を覚えます。測れるようになると、メモリという場所が急に現実味を帯びてきます。
sizeof は演算子
#include <stdio.h>
int main(void) {
printf("char %zu バイト\n", sizeof(char));
printf("int %zu バイト\n", sizeof(int));
printf("double %zu バイト\n", sizeof(double));
printf("bool %zu バイト\n", sizeof(bool));
return 0;
}一般的な64ビット環境では 1 / 4 / 8 / 1 と出ます。sizeof は関数ではなく演算子で、sizeof(型名) でも sizeof 変数 でも書けます。結果は size_t という専用の型なので、書式指定子は %zu を使います。
char が1バイトであることだけは規格で保証されています。他のサイズは環境次第です。「たぶん4」ではなく「測れば分かる」と考えてください。
変数のサイズも測れる
#include <stdio.h>
int main(void) {
int kosuu = 3;
double kingaku = 1980.0;
char kigou = 'A';
printf("%zu %zu %zu\n", sizeof kosuu, sizeof kingaku, sizeof kigou);
printf("合計 %zu バイト\n", sizeof kosuu + sizeof kingaku + sizeof kigou);
return 0;
}出力は 4 8 1 と 合計 13 バイト。3つの箱がメモリに並んで積まれている——最初のトピックのビジュアライザで見た図の、実寸がこれです。
なぜサイズが大事なのか
・入れられる値の範囲が決まる(4バイト=約 ±21億)
・大量のデータを扱うとき、必要なメモリ量を計算できる
・ポインタで1つ進むと何バイト進むかが、このサイズで決まる(トラック12)
3つ目が本命です。今は「型ごとに箱の大きさが違う」という事実だけ、体に入れておいてください。
罠・注意
sizeof('A') は 1 ではない。 Cでは文字定数の型が int なので、多くの環境で 4 になります。sizeof(char) は1、sizeof('A') は4。C++とは違う、Cならではの動きです。
%d で表示しない。 サイズは size_t 型なので %zu が正解です。%d でも動いて見えることがありますが、正しくありません。
sizeof の中身は実行されない。 sizeof(n++) と書いても n は増えません。大きさを調べるだけで、式そのものは評価されないからです。
まとめ
sizeof は型や変数が占めるバイト数を返す演算子で、表示は %zu。char は必ず1、int は4・double は8が一般的です。文字定数 'A' は int 扱いでサイズが4になる点に注意。このサイズの感覚が、ポインタを学ぶときの前提になります。