配列を理解しよう!

[C#] 配列を理解しよう!

※ 当サイトは広告を含みます。

ここでは変数の延長としてC#で配列を利用する方法を学びます。
なお、配列自体が分からない人は先に次の記事に読んでください。

配列は参照型

最初に覚えることはC#の配列は参照型ということです。ここでポイントになるのは配列を示す変数が参照型です。

例えばint型の配列を作った場合、配列を示す変数は参照型ですが、要素内の値はint型なので値型です。
これがstring型の場合、配列を示す変数は変わらず参照型ですが、要素内の値も参照型になります。

配列の宣言、初期化、要素アクセス

難しくないのでコードを見て覚えましょう。


namespace Sample
{
  internal class Program
  {
    static void Main(string[] args)
    {
      // 宣言
      int[] array;

      // 初期化
      array = new int[] { 10, 20, 30 }; // 必要な要素数の数だけ初期化する

      // 要素アクセス
      Console.WriteLine(array[0]); // 前方からインデックス指定
      Console.WriteLine(array[1]); //   〃
      Console.WriteLine(array[2]); //   〃

      Console.WriteLine();

      Console.WriteLine(array[^1]); // 後方からインデックス指定
      Console.WriteLine(array[^2]); //   〃
      Console.WriteLine(array[^3]); //   〃
    }
  }
}
管理人

ポイントは[]を使って宣言してる部分です。これはint型の配列なのでint[]です。
では、string型の配列を作りたい場合はどうすればいいでしょうか?

りさ

string[]です。

管理人

その通り。ついでに初期化のnewは参照型を作る時に必要な記述だよ。
配列へのアクセスもコンピュータサイエンスでやったインデックスと同じだね。

りさ

逆順は学んだ記憶がありませんが。

管理人

これはC#なら許されてる記述だよ。他の言語は知らん。
逆順の注意点は0開始じゃなくて1開始のとこかな。何でだろうね。

宣言と同時に初期化する方法

これも例を見て覚えましょう。こんな感じに記述します。


namespace Sample
{
  internal class Program
  {
    static void Main(string[] args)
    {
      // 宣言と同時に初期化
      int[] array1 = new int[] { 10, 20, 30 };

      // ここまで省略可能
      int[] array2 = { 100, 200, 300, }; // こんな感じに最後に,が付くのも許される

      // 要素アクセス
      Console.WriteLine(array1[0]);
      Console.WriteLine(array1[1]);
      Console.WriteLine(array1[2]);

      Console.WriteLine(array2[0]);
      Console.WriteLine(array2[1]);
      Console.WriteLine(array2[2]);
    }
  }
}
管理人

C#では最後の要素に,(カンマ)を付けてもビルドエラーになりません。これが便利なので覚えておきましょう。

領域だけ確保する方法

配列は先に領域だけ確保することもできます。次の例を見てください。


namespace Sample
{
  internal class Program
  {
    static void Main(string[] args)
    {
      // 領域だけ確保する
      int[] array = new int[3];

      // 初期化
      array[1] = -100;

      // 要素アクセス
      Console.WriteLine(array[0]); // Default値で初期化された
      Console.WriteLine(array[1]);
      Console.WriteLine(array[2]); // Default値で初期化された
    }
  }
}
管理人

領域のみを確保する場合、領域の要素は型に応じた値で初期化されます。
先程の例ではint型を利用したので、全ての要素がDefault値の0で初期化されました。

配列は1つのオブジェクト

これはオブジェクト指向とクラスを理解してないと分かりづらいです。

C#において配列とは単なるメモリの連続領域ではありません。
1つのオブジェクトであり配列という機能を有します。

まずは次の例を見てください。


namespace Sample
{
  internal class Program
  {
    static void Main(string[] args)
    {
      int[] array = new int[] { 10, 20, 30, 40, 50 };

      Console.WriteLine(array.Rank);   // 次元数を取得する
      Console.WriteLine(array.Length); // 配列の長さを取得する
    }
  }
}

本来なら変数arrayは単なるメモリの位置を示すに過ぎませんが、C#では.(ドット)演算子を利用して機能を呼び出すことができます。
この.演算子については現時点では分からなくて構いません。このようにオブジェクトが有する機能を利用できると思ってください。

そして先程の例では次元数と配列の長さを取得するメソッド(後のclass解説で学習)を呼び出しました。
結果的に変数arrayオブジェクトから次元数と長さを取得することができてます。

管理人

現状は変数名に.Rankで次元数、.Lengthで長さが取得できると暗記でも問題ないです。
しっかり進んでclassを理解できれば勝手に身につきます。

様々な配列

C#では先程の1次元配列に加えて多次元配列とジャグ配列を作成することができます。

多次元配列

これが多次元配列の記述方法です。


namespace Sample
{
  internal class Program
  {
    static void Main(string[] args)
    {
      // 領域だけ確保するパターン
      int[,] array1 = new int[2, 3]; // 2 x 3 の要素を持つ多次元配列を作成する

      // 初期化もするパターン
      int[,] array2 = {
        { 10, 20, 30 },
        { 40, 50, 60 },
      };

      // 次元数と長さを取得
      Console.WriteLine(array1.Rank);         // 次元数を取得する
      Console.WriteLine(array1.Length);       // 長さを取得する
      Console.WriteLine(array1.GetLength(0)); // 各次元の長さを取得する
      Console.WriteLine(array1.GetLength(1)); //   〃
      Console.WriteLine();

      // 要素アクセス
      Console.WriteLine(array1[0, 0]);
      Console.WriteLine(array1[0, 1]);
      Console.WriteLine(array1[0, 2]);
      Console.WriteLine(array1[1, 0]);
      Console.WriteLine(array1[1, 1]);
      Console.WriteLine(array1[1, 2]);

      Console.WriteLine();

      Console.WriteLine(array2[0, 0]);
      Console.WriteLine(array2[0, 1]);
      Console.WriteLine(array2[0, 2]);
      Console.WriteLine(array2[1, 0]);
      Console.WriteLine(array2[1, 1]);
      Console.WriteLine(array2[1, 2]);
    }
  }
}

ジャグ配列

こちらはジャグ配列の記述方法です。


namespace Sample
{
  internal class Program
  {
    static void Main(string[] args)
    {
      // 領域だけ確保するパターン
      int[][] array1 = new int[2][]; // 可変するので配列内の配列は要素数が未定

      array1[0] = new int[2] { 10, 20 };         // 要素に配列を初期化
      array1[1] = new int[4] { 30, 40, 50, 60 }; // 要素に配列を初期化

      // 初期化もするパターン
      int[][] array2 = new int[][] {
        new int[] { 1, 2, 4, 8 },
        new int[] { 1, 3, 9 },
        new int[] { 0 },
      };

      // 次元数と長さを取得
      Console.WriteLine(array1.Rank);      // 次元数を取得する
      Console.WriteLine(array1.Length);    // 長さを取得する
      Console.WriteLine(array1[0].Length); // あくまで配列の配列だから要素の長さを取得する
      Console.WriteLine(array1[1].Length); //   〃
      Console.WriteLine();

      // 要素アクセス
      Console.WriteLine(array1[0][0]);
      Console.WriteLine(array1[0][1]);
      Console.WriteLine(array1[1][0]);
      Console.WriteLine(array1[1][1]);
      Console.WriteLine(array1[1][2]);
      Console.WriteLine(array1[1][3]);

      Console.WriteLine();

      Console.WriteLine(array2[0][0]);
      Console.WriteLine(array2[0][1]);
      Console.WriteLine(array2[0][2]);
      Console.WriteLine(array2[0][3]);
      Console.WriteLine(array2[1][0]);
      Console.WriteLine(array2[1][1]);
      Console.WriteLine(array2[1][2]);
      Console.WriteLine(array2[0][0]);
    }
  }
}
管理人

どちらも[]の使い方でコントロールします。似てるので間違えないように注意しましょう。

あとがき

配列を理解しないとコードが地獄絵図になります。絶対に理解しましょう。

管理人

C言語だとint[] arrayじゃなくてint array[]って宣言するんだけど、同時に両方の案件を担当してると紛らわしすぎて頭おかしくなる。

りさ

一生キレてそう。

◆ C#に関する学習コンテンツ

この記事は参考になりましたか?

関連記事

コメント

この記事へのコメントはありません。