C言語基礎|配列の初期

前の節では、配列の各要素に対して a[0] = ... みたいに 代入して値を入れましたよね。
でも実は、配列は 作る瞬間にまとめて値を入れる(初期化する) ことができます。

これができると、

  • 書く量が減ってスッキリする。
  • 「最初の状態」がコードから一目で分かる。
  • 0 で埋める配列が簡単に作れる。

と、いいことが多いんです。ここでは 配列の初期化の基本ルールを、表と図でやさしく整理していきます。

初期化ってなに?(代入との違い)

配列に値を入れる方法は大きく2つあります。

方法いつ値が入る?書き方の例特徴
代入宣言した後a[0] = 10;後から変更できる、入力処理向き
初期化宣言と同時int a[3] = {10, 20, 30};最初の状態をまとめて書ける

初期化は「配列を作る瞬間に中身を決める」感じです。

サンプルプログラム

やること

  • 1週間(7日)の「読書時間(分)」を初期化で用意
  • 添字と一緒に表示

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

// 1週間の読書時間(分)を初期化して表示
#include <stdio.h>

int main(void)
{
    int reading[7] = {15, 30, 0, 20, 10, 45, 25};  // 初期化

    printf("1週間の読書時間(分)を表示します。\n");

    for (int i = 0; i < 7; i++)
        printf("%d日目:%d分\n", i + 1, reading[i]);

    return 0;
}

実行結果例

1週間の読書時間(分)を表示します。
1日目:15分
2日目:30分
3日目:0分
4日目:20分
5日目:10分
6日目:45分
7日目:25分

初期化子 { } の読み方(いちばん基本)

配列の初期化は、各要素の値をカンマ区切りで並べて { } で囲むのが基本です。

意味
int a[5] = {1, 2, 3, 4, 5};a[0]~a[4] を順に 1,2,3,4,5 にする

図で見るとこんな感じです。

「左から順番に入る」だけなので、最初はこれだけ覚えればOKです。

最後のカンマは置いてもいい(地味に便利)

初期化子の最後にカンマを付けてもOKです。

書き方OK?うれしい点
int a[3] = {1, 2, 3};OK普通の書き方
int a[3] = {1, 2, 3,};OK後から追加・削除がラク

縦に並べるスタイル(複数行)だと特に、最後のカンマがある方が編集しやすいです。

要素数を省略すると、個数から自動決定される

要素数を書かずに宣言すると、初期化子の個数が要素数になるルールがあります。

決まる要素数
int b[] = {4, 8, 15};3

図でいうと

「固定データの表」を作るときに便利です。

初期化子が足りないと、残りは 0 になる

ここが超大事ポイントです。
要素数が決まっている配列で、初期化子が途中までしかないとき…

実際に入る値
int c[5] = {1, 2};{1, 2, 0, 0, 0}

図で見ると

全要素を 0 にしたいなら {0} が定番

これ、めちゃ使います。

目的書き方結果
全要素を 0 にするint d[5] = {0};d[0]~d[4] が全部 0

なぜこれで全部 0 になるかというと、さっきの「足りない分は 0」ルールが効くからです。

注意:初期化しない配列は不定値になりやすい

これも重要です。

宣言要素の中身
int x[5];不定値(ゴミの値)になりやすい。

「たまたま 0 っぽい値だった」みたいな事故が起きるので、最初の状態が必要なら 初期化を使うのが安心です。

ここで登場した命令の書式と役割

for 文(配列を順番に処理する)

書式

for (初期化; 条件式; 更新) {
    繰り返す処理
}

何をする命令?
指定回数だけ処理を繰り返して、配列を先頭から順番に表示したり計算したりできます。

今回の例では:

  • i を 0 から始める。
  • i < 7 の間だけ繰り返す。
  • i++ で 1 ずつ増やす。

だから reading[0]~reading[6] を順番に表示できます。

printf(文字と値を組み合わせて表示する)

書式

printf(書式文字列, 値1, 値2, ...);

何をする命令?
書式文字列の %d などの位置に数値を入れて表示します。

よくあるエラー2つ(初期化は万能じゃない)

➀ 初期化子が多すぎるとエラー

結果
int a[3] = {1, 2, 3, 4};エラー(要素数を超える)

➁ 初期化子は「代入」できない

これは間違いです。

int a[3];
a = {1, 2, 3};   // エラー:初期化子は代入できない

初期化子 { } は 宣言とセットのときだけ使える、と覚えるとスッキリします。

演習問題

演習5-3

要素数 5 の int 配列 rev を、先頭から順に 9、8、7、6、5 で初期化し、添字と値を表示するプログラムを作成せよ。

解答例

プロジェクト名:chap5-3-2 ソースファイル名:chap5-3-2.c

#include <stdio.h>

int main(void)
{
    int rev[5] = {9, 8, 7, 6, 5};

    printf("配列の中身を確認します。\n");

    for (int i = 0; i < 5; i++)
        printf("rev[%d] = %d\n", i, rev[i]);

    return 0;
}

まとめ(この節の“気持ちいい理解”)

  • 初期化は「配列を作る瞬間に値を入れる」
  • { } に並べた値は、a[0] から順に入る。
  • 最後のカンマは付けてもOK
  • 要素数を省略すると個数で決まる。
  • 足りない分は 0、{0} で全要素 0
  • 初期化しない配列は不定値になりやすい。