C言語入門|配列型を理解する:配列変数の型と要素の型の違い

C言語を勉強していると、配列を使い始めたあたりで
「えっ? これって何型なの?」
と、ちょっと立ち止まりたくなる瞬間があります。

特にこんな宣言を見たときです。

int scores[5];

この scores という変数、いったい何型の変数だと思いますか?

「int 型かな?」
「だって int って書いてあるし…」

そう感じるのはとても自然です。
でも、ここには C言語ならではの ちょっと大事な落とし穴 があるんです。

このページでは、
配列変数の型要素の型 の違いを、図や表を使いながら、やさしく整理していきます。

配列型の意味を考えてみよう

まずは、先ほどの宣言をもう一度見てみましょう。

int scores[5];

一見すると「int 型の変数を宣言している」ように見えますよね。
でも、int 型が表せるのは 整数1つ だけのはずです。

ところが scores には、整数が5つ入ります。

ここで、こんなふうにイメージしてみてください。

  • 小さな箱(int 型)が 5 個 横に並んでいる。
  • それら全部をひとまとめにして管理している大きな箱が scores

つまり、scores は
整数そのもの ではなく
整数の箱を5個まとめて持っている箱 なんです。

配列変数の型と要素の型はまったく別もの

ここがこの記事でいちばん大切なポイントです。

int scores[5];

この宣言には、実は 2種類の型 が登場しています。

対象説明
配列変数 scoresint[5] 型5個の int をまとめた配列そのもの
各要素 scores[0]int 型整数を1つだけ扱う

と少しややこしいですが、

  • 横に並んだ 5 個の箱 → それぞれが int 型
  • 全体を囲む大きな枠 → これが int[5] 型

配列変数の型 = 配列型
要素の型 = 基本型

この2つは、似ているようで まったく別物 なんですね。

配列型は「配列専用の型」

C言語では、配列全体を表す型を 配列型(array type) と呼びます。

例えばこんな感じです。

宣言配列変数の型
int scores[5];int[5] 型
float temps[3];float[3] 型

要素数が変わると、型そのものも変わる という点がポイントです。

int[5] 型 と int[10] 型は、
見た目は似ていますが 別の型 として扱われます。

C言語の型をざっくり整理してみよう

ここで、C言語に登場する主な型を、役割ごとに整理してみます。

分類型の例
真偽値型bool
文字型char
整数型short, int, long
実数型float, double
集成体型struct ○○型
共用体型union ○○型
配列型int[5] 型 など

配列型は、struct 型と同じ 集成体型 に分類されます。

集成体型って何?

「しゅうせいたい…? なんだか難しそう…」

安心してください。
言葉は少し堅いですが、意味はとてもシンプルです。

複数のデータをひとまとめにした型

これが集成体型です。

  • int 型 → 整数を1つだけ
  • int[5] 型 → 整数を5つまとめて
  • struct 型 → 異なるデータをまとめて

つまり、

  • int 型は「単体」
  • int[5] 型は「集合」

この違いが、配列を理解するうえでとても大切になります。

型の見た目にだまされないで

int[5] 型と int 型は、
見た目が似ているだけで 中身も役割も別物 です。

実は、

  • int 型 と long 型
    よりも
  • int 型 と int[5] 型

のほうが、ずっと遠い存在なんです。

「[] が付いているだけ」と思わずに、
まったく別の型 として意識しておくと、
後々の理解がグッと楽になりますよ。

配列型の表記がややこしく感じる理由

「だったら、こう書けたらいいのに…」

int[5] scores;

残念ながら、C言語ではこれは書けません。

C言語では、配列宣言が次のように分断されて書かれます。

int scores[5];
  • 左側:型の一部(int)
  • 中央:変数名(scores)
  • 右側:型の一部([5])

この 型が左右に分かれて登場する という特徴が、
配列をややこしく感じさせる原因です。

コツとしては、

頭の中では常に
int[5] scores;
と読んであげる

これだけで、理解がずいぶん楽になります。

可変長配列という例外的な存在

基本ルールとして、C言語の配列は
コンパイル時に要素数が決まっている必要があります。

int scores[5];   // OK
int scores[n];   // NG(n が変数の場合)

ただし、近年のC言語では
可変長配列(VLA:variable length array)
という機能も追加されました。

これは、

  • 関数の中だけで使える。
  • 要素数を変数で指定できる。

という特徴を持っています。

ただし、

  • すべてのコンパイラが対応しているわけではない
  • 初期化に制約がある

などの注意点もあります。

初心者のうちは、
配列の要素数は固定する
という基本ルールをしっかり身につけるのがおすすめです。

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

ここでは、理解を助けるために
配列型と要素の型がはっきり分かる簡単な例を見てみましょう。

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

#include <stdio.h>

int main(void)
{
    int levels[3] = { 1, 2, 3 };

    printf("最初のレベルは %d です\n", levels[0]);
    printf("最後のレベルは %d です\n", levels[2]);

    return 0;
}

このプログラムでは、

  • levels は int[3] 型の配列変数
  • levels[0] や levels[2] は int 型の要素

という関係になっています。

printf 命令は
指定した書式に従って文字や数値を表示する命令 です。

  • %d は整数を表示するための指定
  • levels[0] は int 型なので、そのまま渡せます

配列そのものと、要素を使い分けている点に注目してみてください。

まとめ:配列型は「箱をまとめた箱」

最後に、今日の内容をひとことでまとめると、こうなります。

  • 配列変数は要素とは違う型を持つ
  • 配列変数の型は 配列型
  • 配列型は 集成体型 の一種
  • 見た目が似ていても int 型 と int[5] 型は別物

この感覚が身につくと、
ポインタや関数引数に進んだときも、理解がとてもスムーズになります。

焦らず、少しずつ「型の違い」に慣れていきましょう 😊