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
型[] 変数名 = new 型[要素数];
要素 説明
型[] 配列の型。[] が「配列であること」を示す
new 型[要素数] 指定した要素数の配列を新しく生成する
1
int[] scores = new int[5];  // 5 要素の int 配列(すべて 0 で初期化)

数値型は 0boolfalse、参照型は null で自動初期化されます。

初期化子で宣言

書式:配列の宣言(初期化子)

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 { ... } ❌ 左も右も型を持たず推論不可

宣言と同時に値を指定する場合は new 型[] を省略できます。var を使う場合は new が必要です(var scores = { ... } とは書けません)。


3. 要素へのアクセス

インデックスアクセス

書式:要素アクセス

1
配列[インデックス]
要素 説明
インデックス 0 以上 Length - 1 以下の整数
1
2
3
4
5
6
7
int[] scores = { 85, 72, 90, 68, 95 };

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

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

Length プロパティ

Length — 配列の要素数を返します。

書式:Length プロパティ

1
int Length { get; }
1
2
int[] scores = { 85, 72, 90, 68, 95 };
Console.WriteLine(scores.Length);  // 5

末尾からのインデックス(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
int[] scores = { 85, 72, 90, 68, 95 };

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

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


4. 配列の走査

for ループ

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

for (int i = 0; i < scores.Length; i++)
{
    Console.WriteLine($"scores[{i}] = {scores[i]}");
}
// scores[0] = 85
// scores[1] = 72
// scores[2] = 90
// scores[3] = 68
// scores[4] = 95

インデックスが必要な場合(要素の書き換えや位置の利用)は for を使います。

foreach ループ

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

foreach (int score in scores)
{
    Console.WriteLine(score);
}
// 85
// 72
// 90
// 68
// 95

インデックスが不要で要素を順に読むだけなら 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 との使い分けを学びます。