C言語基礎|sizeof演算子の要素数

配列の要素数、数えなくていい。sizeof で一発で出せる“安全な公式”を身につけよう!

配列で真価を発揮する!

sizeof 演算子は「この箱は何バイト?」を調べるための演算子です。
型の大きさ、変数の大きさ、そして配列の大きさまで、メモリのサイズ感を数字で確認できます。

特に便利なのが 配列の要素数を計算で求めるテクニックです。
配列の宣言を変更しても、式の方は変えなくてOK。つまり「数え間違い」を防げます。

ここでは、sizeof を使って 配列の要素数を求める定番の公式を、表と図でしっかり理解していきましょう。

sizeof 演算子は何をする?

sizeof の役割

  • 対象の大きさ(バイト数)を返す
  • 返ってくる値の型は size_t(符号無し整数型)

書き方(2種類)

形式書き方対象括弧
型名形式sizeof(型名)型そのもの必須sizeof(int)
式形式sizeof 式変数・定数・配列・計算式任意(推奨)sizeof(a), sizeof(a[0])

※この記事では読みやすさ優先で、式でも sizeof(式) のように括弧を付けて書きます。

この記事で扱うテーマ:配列の要素数の求め方

配列の要素数は、次の式で求められます。

sizeof(配列) / sizeof(配列の先頭要素)

これがいわゆる「公式」です。

公式を表で整理

部品意味
配列全体の大きさsizeof(a)配列 a 全体のバイト数
要素1個の大きさsizeof(a[0])先頭要素(要素1個)のバイト数
要素数sizeof(a) / sizeof(a[0])全体 ÷ 1個分 で個数が出る

サンプルプログラム

プロジェクト名:chap7-11-1 ソースファイル名:chap7-11-1.c

// 配列の要素数を sizeof で求める例
#include <stdio.h>

int main(void)
{
    int    scores[] = {72, 85, 90, 66, 100, 58};
    double temps[]  = {21.5, 22.0, 19.8, 20.2};

    printf("scores の要素数は %zu 個です。\n", sizeof(scores) / sizeof(scores[0]));
    printf("temps  の要素数は %zu 個です。\n", sizeof(temps)  / sizeof(temps[0]));

    return 0;
}

実行結果例(環境により表示形式は同じ)

scores の要素数は 6 個です。
temps  の要素数は 4 個です。

図で理解:なぜ割ると要素数になるの?

配列は「要素が横に並んだ大きな箱」です。
その箱の合計サイズを、要素1個のサイズで割ると「何個並んでいるか」が出ます。

図(イメージ)

この図の説明

  • sizeof(scores) は、配列 scores 全体(6個ぶん)の合計サイズを返します。
  • sizeof(scores[0]) は、scores の先頭要素(int 1個)のサイズを返します。
  • 合計サイズ ÷ 1個サイズ = 個数、という理屈です。

重要:この公式が強い理由(型や環境に依存しにくい)

たとえば int の大きさは環境によって 2 バイトだったり 4 バイトだったりします。
でも、この式はちゃんと要素数を出してくれます。

確認用の表

環境sizeof(int)6要素の配列全体計算要素数
例121212 / 26
例242424 / 46

つまり 要素の型が変わっても、環境が変わっても、要素数が安定して求まるのがポイントです。

よくある注意点(ここだけは押さえよう)

関数に渡した配列では、この公式が効かないことがある

関数の引数で配列を受け取ると、多くの場合「配列全体」ではなく「先頭要素へのポインタ」として扱われます。
すると sizeof(a) が配列全体ではなく、ポインタのサイズになってしまいます。

※この話は「配列の受け渡し」の章でがっつり出てくるので、ここでは“予告”だけしておきますね。

登場する命令(演算子・関数)の書式と説明

sizeof(演算子)

項目内容
書式sizeof(型名)、sizeof 式
何をする?対象のバイト数を返す
戻り値の型size_t

printf(関数)

項目内容
書式printf(書式文字列, 値, ...);
何をする?書式に合わせて文字や数値を表示する
size_t の表示%zu を使う

まとめ(覚える公式)

配列の要素数は、次の式で求められる。

sizeof(a) / sizeof(a[0])

型や環境に左右されにくいので、安心して使える“定番の公式”として覚えてOKです。