同じ型の箱を一列に並べる。添字の0始まり、ループとの黄金コンビ、そして境界外アクセスという重大事故を最初から意識する。
5人分のテストの点数を記録してください、と言われたらどう書きますか。 5人ならまだ我慢できます。では40人のクラスは。1000人の模試は。合計を出すのに score1 + score2 + ... と1000個並べるのは現実的ではありません。同じ型のデータをまとめて扱う道具が必要です。それが配列です。 [5] は「箱の個数」を表します。並んだ箱の1つずつを要…
「1番目の要素が a[0]」——最初はどうしても違和感があります。なぜ1から始めてくれなかったのでしょうか。 答えは、添字が「何番目か」ではなく「先頭から何個ぶんずれているか」を表しているからです。 先頭の要素は、先頭から0個ぶんずれた場所にあります。だから a[0]。この「ずれ」の考え方はコンピュータにとって都合がよく、a[i] の場所を「配列の先頭 + …
配列とfor文は、Cでいちばん出番の多い組み合わせです。「同じ処理を、全要素に対して」というパターンは、この形にすべて収まります。 この5行が体に入ると、合計・平均・最大値・検索・並べ替えまで、ほとんどの処理が同じ骨格で書けるようになります。中身を差し替えるだけで、やれることが次々に増えるからです。 sum += a[i]; → 合計 if (a[i] > …
このトピックは、C言語を学ぶうえで最も重要な安全教育です。文法よりも先に、体に刻んでください。 int a[3] と宣言したのに a[3] や a[5] に触れる。これを境界外アクセスと呼びます。そしてCは、それを黙って通します。 x は一度も書き換えていないのに、値が変わることがあります。配列のすぐ隣に置かれていた x の場所を、a[3] が踏んだからです…
宣言しただけの配列の中身は不定です。前に別の処理が使っていた値がそのまま残っている、いわばゴミの状態。読んでも意味のない数字が出てきます。だから配列は、作ると同時に中身を決めるのが基本です。 足りないぶんは0で埋まる 初期化子が要素数より少ないとき、残りは自動的に 0 になります。この性質を使った定番の書き方が {0} です。 逆に、要素数より多く書くとコン…
配列の要素を、さらに配列にできます。こうしてできるのが多次元配列で、いちばん出番が多いのは2次元です。表・マス目・座席表・画像——縦横に並ぶものは、たいていこれで表せます。 読み方は「int が3個入った配列が、2個並んだもの」。先の [2] が行数、後ろの [3] が列数です。アクセスは m[行][列] の順で、どちらの添字も0始まりです。 どんなときに使…
配列も関数に渡せます。書き方はこうです。 渡すときは score と角カッコなしの名前だけを書きます。受け取る側は int a[] と書き、個数は空のままにします。 なぜ要素数も一緒に渡すのか ここが最大のポイントです。関数の中では、受け取った配列が何個の要素を持つのか分かりません。sizeof(a) / sizeof(a[0]) を関数の中で書いても、正し…
配列でやることは、実のところ数種類しかありません。ここで型(かた)として覚えてしまえば、あとは組み合わせるだけです。 毎回ゼロから考えると、初期値や範囲の判断でどこかを間違えます。型として手が覚えていれば、考える対象は「何を集計するか」だけになります。慣れた人がすばやくコードを書けるのは、頭の回転が速いからではなく、この引き出しを持っているからです。 定石1…
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。