🗃️ 配列
🎯 添字が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 の最小値と最大値を実際に代入して、両端が範囲に収まるか確かめる癖をつけてください。
罠・注意
a[2] です。日常の数え方と1つずれるので、コードを書くときは常に「先頭が0」と唱えましょう。a[-1] は配列の手前を読む危険なコードです。i <= n にする間違いは、1つだけ外側に触れるのでオフバイワンエラーと呼ばれます。バグの定番中の定番です。a[i + 1] や a[n - i - 1](逆順)はよく使う書き方ですが、範囲からはみ出しやすいので、i の動く範囲を必ず確認してください。慣れるまでは、紙に箱を並べて0から番号を振ってみるのがいちばんの近道です。頭の中だけで数えようとすると、必ず1つずれます。
まとめ: 添字は「先頭からのずれ」。範囲は 0 〜 個数−1、ループは i < n。この2つを体に入れれば、次のトピックの重大事故を避けられます。
「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。