トラック8・🗃️配列

添字と0始まりの理由

読む目安 約11分・ゴール:添字が0始まりである理由を理解し、範囲を間違えずにループを書ける

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

「1番目の要素が a[0]」——最初はどうしても違和感があります。なぜ1から始めてくれなかったのでしょうか。

答えは、添字が「何番目か」ではなく「先頭から何個ぶんずれているか」を表しているからです。

        a[0]   a[1]   a[2]   a[3]   a[4]
      +------+------+------+------+------+
      |  60  |  85  |  40  |  90  |  75  |
      +------+------+------+------+------+
先頭から  0個   1個   2個   3個   4個 ずれた場所

先頭の要素は、先頭から0個ぶんずれた場所にあります。だから a[0]。この「ずれ」の考え方はコンピュータにとって都合がよく、a[i] の場所を「配列の先頭 + i × 1個分の大きさ」という単純な計算で一瞬で求められます。要素が10万個あっても、a[99999] へのアクセスは a[0] と同じ速さです。

使える範囲は 0 から 個数-1 まで

int a[5] なら、使ってよい添字は 0・1・2・3・4 です。要素数は5、いちばん大きい添字は4。この「1つずれ」が、Cで最も多い間違いの原因になります。

#include <stdio.h>

int main(void)
{
    int a[5] = {60, 85, 40, 90, 75};

    for (int i = 0; i < 5; i++) {          // i は 0,1,2,3,4
        printf("a[%d] = %d\n", i, a[i]);
    }
    return 0;
}

for文の条件が i < 5 になっているところが肝心です。i <= 5 と書くと a[5] に触れてしまい、存在しない6番目の箱を読むことになります。「要素数と同じ数までは行かない」——< を使うのが定石です。

先頭と末尾の覚え方

int a[5] = {60, 85, 40, 90, 75};
int n = 5;

a[0];       // 先頭
a[n - 1];   // 末尾(a[4])

n - 1 で末尾、と手が覚えるまで書いてください。要素数を変数 n で持っておくと、配列の大きさを変えたときに直す場所が1か所で済みます。

逆順に表示したいときは a[n - 1 - i] と書きます。i が 0 のとき末尾、i が n - 1 のとき先頭です。式が複雑になったら、i の最小値と最大値を実際に代入して、両端が範囲に収まるか確かめる癖をつけてください。

罠・注意

師範添字は順番ではなく、ずれの数じゃ。そう思えば0から始まるのが自然に見えてくる

慣れるまでは、紙に箱を並べて0から番号を振ってみるのがいちばんの近道です。頭の中だけで数えようとすると、必ず1つずれます。

まとめ: 添字は「先頭からのずれ」。範囲は 0 〜 個数−1、ループは i < n。この2つを体に入れれば、次のトピックの重大事故を避けられます。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

配列の添字が 0 から始まる理由として、最も適切な説明はどれですか。

  1. コンピュータは1を数えられないから
  2. 添字が「先頭からのずれの数」を表しているから
  3. 0を使うと計算が速くなるという決まりがあるから
  4. 他の言語との互換性のため
答えを見る

正解:B(添字が「先頭からのずれの数」を表しているから)

a[i] は「先頭から i 個ぶんずれた場所」を意味します。先頭はずれ0なので a[0]。この仕組みのおかげで、どの要素にも同じ速さでアクセスできます。

確認問題 2

次のプログラムの出力はどれですか。

#include <stdio.h>

int main(void)
{
    int a[4] = {10, 20, 30, 40};

    printf("%d ", a[0]);
    printf("%d ", a[3]);
    printf("%d\n", a[4 - 3]);
    return 0;
}
  1. 10 40 20
  2. 10 30 20
  3. 20 40 30
  4. 10 40 30
答えを見る

正解:A(10 40 20)

a[0] は先頭の 10、a[3] は末尾の 40 です。添字には計算式も書けるので、a[4 - 3] は a[1] で 20 になります。末尾の添字が「要素数 - 1」である点も確認しておきましょう。

「配列」の目次

  1. 配列とは——箱の行列
  2. 添字と0始まりの理由
  3. 配列とループの黄金コンビ
  4. 境界外アクセスという重大事故
  5. 配列の初期化いろいろ
  6. 多次元配列
  7. 配列を関数に渡す——入口編
  8. 集計・最大値・検索の定石

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版