本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第9回 | C言語の配列の基本を学ぶ:同じ型の値をまとめて扱う| UNIX Cafe

はじめてのC言語 | 第9回
はじめに
前回は、関数を使って処理をまとめる方法を学びました。
今回は、同じ型の値をまとめて保存する「配列」を扱います。
この回の目的は次の5点です。
- 配列の役割を理解する
- 配列の宣言と初期化の書き方を覚える
- 要素の取り出し方を知る
- for 文と組み合わせた基本的な使い方を確認する
- 2次元配列の基本を知る
配列とは何か
配列は、同じ型の値を順番に並べて保存する仕組みです。
たとえば、5人分の点数を保存したいときに使います。
変数を5個用意することもできますが、配列を使うと1つのまとまりとして扱えます。
配列の基本形
宣言の書式
型 配列名[要素数];例:
int scores[5];このコードは、整数を5個保存できる配列 scores を宣言しています。
最初のサンプルコード
ソースコード
array_sample.c という名前で保存します。
#include <stdio.h>
int main(void) {
int scores[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
printf("%d\n", scores[0]);
printf("%d\n", scores[1]);
printf("%d\n", scores[2]);
return 0;
}実行手順
1. 作業ディレクトリに移動する
cd ~/Desktop2. コンパイルする
clang array_sample.c -o array_sample3. 実行する
./array_sample実行結果:
80
90
75コードの読み方
int scores[3];
整数を3個保存できる配列 scores を宣言しています。
scores[0] = 80;
配列の先頭の要素に 80 を代入しています。
scores[1] = 90;
2番目の要素に 90 を代入しています。
scores[2] = 75;
3番目の要素に 75 を代入しています。
配列の添字に注意する
C言語の配列は、0番目から始まります。
3個の要素がある場合、使える添字は次の3つです。
- 0
- 1
- 2
つまり、scores[3] は使えません。
初期化して宣言する
配列は、宣言と同時に値を入れることもできます。
#include <stdio.h>
int main(void) {
int scores[3] = {80, 90, 75};
printf("%d\n", scores[0]);
printf("%d\n", scores[1]);
printf("%d\n", scores[2]);
return 0;
}実行結果は同じです。
80
90
75この書き方の方が、値が最初から決まっているときは分かりやすいです。
for 文で配列を順番に処理する
配列は for 文と非常に相性が良いです。
#include <stdio.h>
int main(void) {
int scores[3] = {80, 90, 75};
int i;
for (i = 0; i < 3; i++) {
printf("%d\n", scores[i]);
}
return 0;
}実行結果:
80
90
75なぜ for 文と組み合わせるのか
配列の要素が増えるたびに、次のように1行ずつ書くのは非効率です。
printf("%d\n", scores[0]);
printf("%d\n", scores[1]);
printf("%d\n", scores[2]);for 文を使えば、添字を変えながら同じ処理を繰り返せます。
for (i = 0; i < 3; i++) {
printf("%d\n", scores[i]);
}この形は、配列を扱う基本になります。
合計を計算する例
配列の要素を順番に足していく例です。
#include <stdio.h>
int main(void) {
int scores[3] = {80, 90, 75};
int i;
int total = 0;
for (i = 0; i < 3; i++) {
total = total + scores[i];
}
printf("%d\n", total);
return 0;
}実行結果:
245平均を計算する例
整数同士の割り算になる点に注意します。
#include <stdio.h>
int main(void) {
int scores[3] = {80, 90, 75};
int i;
int total = 0;
int average;
for (i = 0; i < 3; i++) {
total = total + scores[i];
}
average = total / 3;
printf("%d\n", average);
return 0;
}実行結果:
81245 / 3 は 81.666… ですが、int 型同士の計算なので結果は 81 になります。
初心者がつまずきやすい点
添字は0から始まる
これは配列で最も重要な点です。
scores[0]が最初の要素です。
1 から始まるわけではありません。
範囲外の添字を使わない
次のようなコードは問題があります。
int scores[3] = {80, 90, 75};
printf("%d\n", scores[3]);scores[3] は範囲外です。
C言語ではこのようなアクセスは未定義動作になります。
エラーにならずに動いてしまうこともありますが、正しい結果は保証されません。
要素数と繰り返し回数を合わせる
次のコードは危険です。
for (i = 0; i < 5; i++) {
printf("%d\n", scores[i]);
}scores が3要素しかない場合、scores[3] や scores[4] にアクセスしてしまいます。
よくあるエラー
use of undeclared identifier
原因: 配列や変数を宣言する前に使っています。
対処: int scores[3]; や int i; を先に書きます。
範囲外アクセスによる不正な動作
原因: 添字が大きすぎます。
対処: 配列の要素数を確認し、for 文の条件を見直します。
初期化の個数が多すぎる
誤った例:
int scores[3] = {80, 90, 75, 60};要素数より多い値は入れられません。
2次元配列とは何か
配列は、横一列に値を並べるだけでなく、表のように行と列で値を管理することもできます。
このような配列を「2次元配列」と呼びます。
たとえば、3人分の点数を、国語・数学・英語の3教科で保存したい場合を考えます。
int scores[3][3] = {
{80, 70, 90},
{75, 85, 60},
{90, 95, 88}
};この配列は、3行3列の表として考えることができます。
scores[0][0]は、1人目の国語の点数scores[0][1]は、1人目の数学の点数scores[1][0]は、2人目の国語の点数
2次元配列では、最初の添字が「行」、次の添字が「列」を表すと考えるとわかりやすくなります。
2次元配列のサンプルコード
#include <stdio.h>
int main(void) {
int scores[3][3] = {
{80, 70, 90},
{75, 85, 60},
{90, 95, 88}
};
printf("%d\n", scores[0][0]);
printf("%d\n", scores[0][1]);
printf("%d\n", scores[0][2]);
return 0;
}実行結果:
80
70
90このコードでは、1人目の3教科の点数を順番に表示しています。
2重の for 文で表示する
2次元配列のすべての値を表示するときは、for 文を2つ組み合わせます。
#include <stdio.h>
int main(void) {
int scores[3][3] = {
{80, 70, 90},
{75, 85, 60},
{90, 95, 88}
};
int i;
int j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%d ", scores[i][j]);
}
printf("\n");
}
return 0;
}外側の for 文は行を進め、内側の for 文は列を進めています。
2次元配列も、添字は 0 から始まります。scores[3][0] や scores[0][3] のように、範囲外の添字を指定しないように注意しましょう。
ミニゲーム:九九の段を選んで表示する
2次元配列を使うと、表のようなデータをまとめて保存できます。次の array_09.c は、九九の答えを 9 行 9 列の配列に入れておき、入力された段だけを表示するミニゲームです。
int a[9][9]; は、整数を 9×9 個保存できる2次元配列です。九九の表全体を配列に保存しておくことで、あとから必要な場所だけを取り出せます。
#include <stdio.h>
int main(void) {
int a[9][9];
int i, j, dan;
// 1. まず九九を全部計算して配列に入れておく
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
a[i - 1][j - 1] = i * j;
}
}
// 2. ユーザーに聞く
printf("何段を表示しますか? (1-9): ");
if (scanf("%d", &dan) != 1) {
printf("整数を入力してください。\n");
return 1;
}
// 3. 入力された段だけ表示する
if (dan >= 1 && dan <= 9) {
printf("--- %dの段 ---\n", dan);
for (j = 1; j <= 9; j++) {
printf("%dx%d = %d\n", dan, j, a[dan - 1][j - 1]);
}
} else {
printf("1から9までの数字を入力してください。\n");
}
return 0;
}コンパイルと実行:
clang array_09.c -o array_09
./array_09たとえば 7 を入力すると、次のように 7 の段だけが表示されます。
何段を表示しますか? (1-9): 7
--- 7の段 ---
7x1 = 7
7x2 = 14
7x3 = 21
7x4 = 28
7x5 = 35
7x6 = 42
7x7 = 49
7x8 = 56
7x9 = 63このプログラムの中心は、最初の2重の for 文です。外側の for 文が段を進め、内側の for 文が 1 から 9 までのかけ算を進めています。
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
a[i - 1][j - 1] = i * j;
}
}i と j は 1 から 9 まで動きますが、配列の添字は 0 から始まります。そのため、保存するときは a[i - 1][j - 1] と書いています。たとえば 7 の段の 3 番目の答えは、a[6][2] に入っています。
練習用コード
5個の整数を表示する
#include <stdio.h>
int main(void) {
int numbers[5] = {10, 20, 30, 40, 50};
int i;
for (i = 0; i < 5; i++) {
printf("%d\n", numbers[i]);
}
return 0;
}合計を求める
#include <stdio.h>
int main(void) {
int numbers[5] = {10, 20, 30, 40, 50};
int i;
int total = 0;
for (i = 0; i < 5; i++) {
total = total + numbers[i];
}
printf("%d\n", total);
return 0;
}実行結果:
150まとめ
今回のポイントは次のとおりです。
- 配列は同じ型の値をまとめて保存する仕組みである
- 配列の添字は 0 から始まる
scores[i]のようにして各要素を扱う- 配列は
for文と組み合わせると効率よく処理できる - 2次元配列を使うと、表のように行と列で値を管理できる
この回では、C言語の配列の基本を確認しました。
配列を使えるようになると、複数の値をまとめて処理できるようになります。
次回予告
次回は、文字列の基本を学びます。
C言語では文字列も配列と深く関係しているため、ここまでの内容がそのまま土台になります。
文字の並びをどう扱うのかを理解すると、C言語でできることがまた少し広がっていきます。
復習してみよう
復習したい方は、こちらもあわせてご覧ください。













