C言語学習ポータル(無料版) 学習コンテンツ 配列 添字と0始まりの理由

🗃️ 配列

添字と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つを体に入れれば、次のトピックの重大事故を避けられます。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

添字(インデックス)そえじ

配列の中の何番目の要素かを指定する番号のこと。C言語では、この番号を0から数え始める点にとくに注意が必要になる。要素数が5個の配列なら、添字は0から4までの範囲になる。

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

同じトラックのほかの項目

配列とは——箱の行列配列の宣言と要素へのアクセスができ、変数を並べるより配列が優れる理由を説明できる 配列とループの黄金コンビforループで配列全体を走査でき、要素数を安全に管理できる 境界外アクセスという重大事故境界外アクセスが未定義動作であることを理解し、危険性と防ぎ方を説明できる 配列の初期化いろいろ配列の初期化の書き方を使い分けられ、未初期化の危険を避けられる 多次元配列2次元配列を宣言・初期化し、二重ループで表として扱える 配列を関数に渡す——入口編配列を関数へ渡す書き方を身につけ、値渡しとの違いに気づける 集計・最大値・検索の定石合計・最大値・線形探索の定型パターンを自力で書ける
‹ 配列とは——箱の行列 配列とループの黄金コンビ ›

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

完全版(BOOTH)を見る

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

Web版 / BOOTH