C# 配列と構造体

C#

配列

同じ型の複数のデータをひとまとまりにして扱うデータ構造として、配列というものがあります。

配列には、型、配列名、要素数を与えます。配列の型によって、保存するデータの種類が決まり、配列の要素数によって、その配列に保存できるデータの数が決まります。

配列の実体を作成すると、指定した型に応じた要素数分のメモリ領域が確保され、各領域には、ゼロから(要素数-1)まで順番に番号が割り振られます。配列名と割り振られた番号を使ってデータをメモリ領域に書き込んだり、読み出したりします。

配列は、要素番号を増減することで各データにアクセスできるので、繰り返し処理を使って配列内のデータの読み書きを容易に行うことができます。特に、C#では、繰り返し処理のforeach文を使うと、配列内のすべてのデータへの読み書きが簡単にできます。

foreach文については、繰り返し文の記事にまとめています。

C# 制御文-繰り返し文-
C#の繰り返し文(while,do while,for,foreach)の構造と使い方について記載します。

配列の書き方

配列は、型と配列名、要素数で宣言します。

この宣言により、型と要素数に応じたメモリ領域が自動的に確保されます。

「new」は、new演算子と呼ばれるもので、実体を生成するときに使います。

例のようにchar型で配列名aを要素数4で宣言すると4バイト分の領域が確保され、a[0]、a[1]、a[2]、a[3]をchar型の変数として扱うことができます。

配列の宣言と同時に初期値を入れたい場合は、中括弧「{ }」内に要素数分の初期値をカンマ区切りで記述します。初期化方法は、その他に、配列領域のみ確保して、以降のプログラムで、初期値を代入する方法もあります。

ここでみてきた配列は、要素が一列に並んだ配列になります。このような配列を一次元配列といいます。配列は、複数行に拡張することができます。拡張した配列を多次元配列といいます。

次に、配列を二行に拡張した二次元配列の書き方についてみていきます。

二次元配列の書き方

二次元配列は、各行の要素数をカンマで区切って記述します。

例では、2行3列の要素を持つbyte型の配列aを宣言しています。

初期化をする場合としない場合で、上段の形か下段の形かに分かれます。

初期値は、行ごとに中括弧「{ }」をカンマ区切りで記述します。

この例の場合、配列a の要素(0,0)に「0」、要素(0,1)に「1」、要素(0,2)に「2」、要素(1,0)に「3」、要素(1,1)に「4」、要素(1,2)に「5」が初期値として与えられます。

同じような考え方で、配列の「[ , ]」のカンマを増やしていくことで、三次元、四次元と配列の次元を拡張できます。

一次元配列の使用例

一元配列のプログラム例を記載します。

初期化方法が異なりますが、どちらも同じ結果となります。

using System;

namespace ArrayTest
{
    class ArrayTest
    {
        static void Main(string[] args)
        {
            char[] a = new char[4];

            a[0] = 'a';
            a[1] = 'b';
            a[2] = 'c';
            a[3] = 'd';

            foreach (char c in a)
            {
                Console.WriteLine(c);
            }
            Console.WriteLine("end\n");
        }
    }
}
using System;

namespace ArrayTest
{
    class ArrayTest
    {
        static void Main(string[] args)
        {
            char[] a = new char[4] {'a','b','c','d'};

            foreach (char c in a)
            {
                Console.WriteLine(c);
            }

            Console.WriteLine("end\n");
        }
    }
}
c:\prog\cs>cs_array
a
b
c
d
end

二次元配列の使用例

二次元配列のプログラム例を記述します。

using System;

namespace ArrayTest
{
    class ArrayTest
    {
        static void Main(string[] args)
        {
            byte[,] a = new byte[10,11] {
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //1行目
                { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0xFF},    //2行目
                { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //3行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //4行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //5行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //6行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //7行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //8行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF},    //9行目
                { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}     //10行目
            };
            foreach (byte b in a)
            {
                if( b == 0xFF)
                {
                    Console.WriteLine();
                }
                else if( b == 0)
                {
                    Console.Write("■");
                }
                else
                {
                    Console.Write("□");
                }
            }
            Console.WriteLine("end\n");
        }
    }
}
c:\prog\cs>cs_array
■■■■□■■■■■
■■■□□■■■■■
■■□■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
end

構造体

配列は、同一型のデータの集まりを扱うデータ型でしたが、異なる型のデータの集まりを作りたい場合、構造体という型を使います。

構造体は、char型やbyte型など、はじめから決められたデータサイズを扱う型とは異なり、プログラム設計者によって作られる独自の構成となります。

ですので、構造体は、同一の型も含め、異なる型、配列など、作りたいデータの集まりを自由に組み合わせることができます。

構造体の書き方

構造体は、下の図のように記述します。

定義した構造体の実体の宣言は、

構造体タグ名 構造体名

のように記述し、構造体の各メンバーへのアクセスは、

構造体名メンバー名

というように、構造体名とメンバー名をドット演算子(ピリオド)でつなぎます。

具体的にサンプルプログラムでみていきたいと思います。

構造体の使用例

この例では、int型の変数x,y,zをもつ構造体position型を作成しています。

「 position pst; 」でposition型の実体であるpstを作成して、

「 pst.x = 1 」「 pst.y = 2 」「 pst.z = 3 」でposition型の各メンバーx,y,zにアクセスしています。

using System;

namespace StructTest
{
    class StructTest
    {
        public struct position
        {
            public int x;
            public int y;
            public int z;
        }
        static void Main(string[] args)
        {
            position pst;
            pst.x = 1;
            pst.y = 2;
            pst.z = 3;
            Console.WriteLine("X:{0} Y:{1} Z:{2}",pst.x,pst.y,pst.z);
            Console.WriteLine("end\n");
        }
    }
}
c:\prog\cs>cs_struct
X:1 Y:2 Z:3
end

コメント

タイトルとURLをコピーしました