Unity & C# 学習教材

配列の基礎

配列(array)は、同じ型の値を連続して格納するデータ構造です。複数の値を 1 つの変数でまとめて管理できます。

学習目標

前提知識


1. 配列とは

配列はメモリ上に連続して並んだ格納場所の集まりです。各格納場所には 0 から始まるインデックス(番号)でアクセスします。

scores [0] [1] [2] [3] [4] 85 72 90 68 95 scores[0] scores[4]

5 つの整数を格納する int[] scores を例に説明します。先頭は scores[0]、末尾は scores[4] でアクセスします。


2. 配列の宣言と初期化

変数の宣言

配列を使うには、まず配列を参照するための変数を宣言します。

書式:配列変数の宣言

1
型[] 変数名;
要素 説明
型[] 配列の型。[] が「配列であること」を示す
変数名 配列を参照するための変数
1
int[] scores;  // int 型配列を参照する変数を宣言

この時点では変数 scores が存在するだけで、配列の実体(要素を格納するメモリ領域)はまだ生成されていません。

new 式による配列インスタンスの生成

配列の実体を生成するには newを使います。

書式:配列インスタンスの生成

1
new 型[要素数]
要素 説明
要素の型
要素数 格納できる要素の個数(生成後に変更不可)

生成した配列を変数に代入することで、変数から配列にアクセスできるようになります。

1
2
int[] scores;          // 変数を宣言
scores = new int[5];   // 5 要素の配列を生成して代入

宣言と代入は 1 行にまとめるのが一般的です。

1
int[] scores = new int[5];  // 宣言と同時に配列を生成

生成直後の要素は型ごとの既定値で自動初期化されます。数値型は 0boolfalse、参照型は null です。


3. 要素へのアクセス

インデックスアクセス

書式:要素アクセス

1
配列[インデックス]
要素 説明
インデックス 0 以上 Length - 1 以下の整数

配列を生成した後、インデックスを使って各要素に個別に値を代入できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
int[] scores = new int[5];  // 全要素が 0 で初期化

scores[0] = 85;  // 先頭要素に代入
scores[1] = 72;
scores[2] = 90;
scores[3] = 68;
scores[4] = 95;  // 末尾要素に代入

Console.WriteLine(scores[0]);  // 85(先頭)
Console.WriteLine(scores[4]);  // 95(末尾)

scores[2] = 100;               // 値の書き換え
Console.WriteLine(scores[2]);  // 100

末尾からのインデックス(C# 8 以降)

書式:末尾インデックス

1
配列[^n]

^1 は末尾の要素、^2 は末尾から 2 番目を指します。

[0] [1] [2] [3] [4] 85 72 90 68 95 [^5] [^4] [^3] [^2] [^1]
1
2
3
4
5
6
7
8
9
int[] scores = new int[5];
scores[0] = 85;
scores[1] = 72;
scores[2] = 90;
scores[3] = 68;
scores[4] = 95;

Console.WriteLine(scores[^1]);  // 95(末尾)
Console.WriteLine(scores[^2]);  // 68(末尾から 2 番目)

💡 scores[^1]scores[scores.Length - 1] と同じ意味です。


4. 配列初期化子

個別に代入する代わりに、配列初期化子(array initializer)を使うと宣言と同時に値を設定できます。

書式:配列初期化子

1
型[] 変数名 = { 値1, 値2, ... };
1
2
3
4
5
6
7
8
9
10
11
int[] scores = { 85, 72, 90, 68, 95 };

// new を明示する書き方も同じ意味
int[] scores2 = new int[] { 85, 72, 90, 68, 95 };

// var を使う場合は new が必要
var scores3 = new int[] { 85, 72, 90, 68, 95 };  // var は int[] と推論される
var scores4 = new[] { 85, 72, 90, 68, 95 };       // 要素の型から自動推論(型名を省略)

// ❌ NG: var と { } の組み合わせ — 左も右も型を決められず推論不可
var scores5 = { 85, 72, 90, 68, 95 };             // コンパイルエラー
左辺 右辺 結果
int[] { ... } ✅ 左辺が型を決める
var new int[] { ... } ✅ 右辺が型を決める
var new[] { ... } ✅ 要素の型から右辺が決める
var { ... } ❌ 左も右も型を持たず推論不可

int[] を左辺に書けば new int[] を省略できます。var を使う場合は new が必要です(var scores = { ... } とは書けません)。


5. 配列の走査

for ループ

全要素をループで処理するとき、終了条件に要素数を直接書くことができます。

1
2
3
4
5
6
int[] scores = { 85, 72, 90, 68, 95 };

for (int i = 0; i < 5; i++)  // 終了条件に定数 5 を使用
{
    Console.WriteLine($"scores[{i}] = {scores[i]}");
}

しかしこの書き方では、配列の要素数が変わったときにループの終了条件も手で直す必要があります。要素を 1 つ追加して 6 要素に変えても i < 5 はそのままなので、末尾の要素が読み取れません。

Length プロパティを使うと、配列が持つ要素数を常に正確に取得できます。

書式:Length プロパティ

1
int Length { get; }

これで配列の要素数を得られるのでループの終了条件に使うと、要素数と自動的に連動します。

1
2
3
4
5
6
int[] scores = { 85, 72, 90, 68, 95 };

for (int i = 0; i < scores.Length; i++)  // 要素数と自動的に連動する
{
    Console.WriteLine($"scores[{i}] = {scores[i]}");
}

要素数が変わっても scores.Length が常に正しい値を返すため、ループ条件を修正する必要がありません。インデックスが必要な場合(要素の書き換えや位置の利用)は for を使います。

foreach ループ

1
2
3
4
5
6
int[] scores = { 85, 72, 90, 68, 95 };

foreach (int score in scores)
{
    Console.WriteLine(score);
}

インデックスが不要で要素を順に読むだけなら foreach が簡潔です。var 型推論・読み取り専用の制約・break/continue との組み合わせ・for との使い分けは配列と foreach(補足)で詳しく解説します。


よくあるミス

1
2
3
4
5
6
7
8
int[] scores = { 85, 72, 90, 68, 95 };

// ❌ NG: インデックスが Length と等しい(範囲外)
Console.WriteLine(scores[5]);  // System.IndexOutOfRangeException

// ✅ OK: 最後の要素は Length - 1 または ^1
Console.WriteLine(scores[scores.Length - 1]);  // 95
Console.WriteLine(scores[^1]);                  // 95

配列のインデックスは 0Length - 1 の範囲です。Length そのものはインデックスとして使えません。


ワンポイントアドバイス

C# 12 のコレクション式

C# 12 から [...] を使ったコレクション式で配列を初期化できます。

1
2
// C# 12 以降
int[] scores = [85, 72, 90, 68, 95];

{ } 構文と同じ意味ですが、List<T> などでも同じ記法が使える統一構文です。


まとめ


理解度チェック

  1. 要素数 3 の string 配列を "red", "green", "blue" で初期化するコードを書いてください。
  2. 次のコードを実行すると何が出力されますか?

    1
    2
    
    int[] nums = new int[3];
    Console.WriteLine(nums[1]);
    
  3. for ループを使って配列のすべての要素の合計を計算するコードを書いてください。
解答を見る
  1. 1
    
    string[] colors = { "red", "green", "blue" };
    
  2. 0 が出力されます。数値型配列の要素は 0 で自動初期化されるためです。

  3. 1
    2
    3
    4
    5
    6
    7
    
    int[] nums = { 1, 2, 3, 4, 5 };
    int sum = 0;
    for (int i = 0; i < nums.Length; i++)
    {
        sum += nums[i];
    }
    Console.WriteLine(sum);  // 15
    

次のステップ

配列と foreach(補足) では、foreach の書式詳細・var 推論・break/continue との組み合わせ・for との使い分けを学びます。