個別のデータを連結する

前回の配列は、同じデータ型の変数を列のように並べて操作するものでした。同じデータ型の値を大量に管理する場合は便利ですが、現実の情報をコンピュータで扱う場合、関連した異なるデータ型を管理しなければなりません。例えば、身長というデータは整数型ですが、身長だけを管理するソフトウェアは存在しないでしょう。通常は、誰の身長なのかを表す名前などと関連付けられます。同時に、体重や血液型など、他の多くの情報を連結して、実用的な個人情報として管理できます。

このような、異なるデータ型が集まって1つの有用な情報となるデータ構造の場合、名前や身長などの変数を個別に作成するのは合理的ではありません。そこで、構造体を用いて異なる型の変数を1つにまとめて管理します。構造体は、複数の変数の集合であり、複雑なデータを1つの変数として表現できます。

実践のプログラミングでは、複数の値を1つの構造体にまとめた方が便利になるデータが多くあります。例えば、X要素とY要素からなる2次元座標や、幅と高さからなるサイズなどは、2つの整数型の変数を用意するよりも2つの整数型のメンバを持つ1つの構造体とした方が、値が結び付けられるため、整数の関係が明確になります。赤要素・緑要素・青要素からなる色や、時・分・秒からなる時刻、都道府県・市町村・番地からなる住所など、複数のデータが集まって1つの意味のある情報となるものは、現実世界に多く存在します。

Visual C++ 2008 Express Editionのインストールや設定方法については「ゼロからはじめるC言語 - 環境構築編」を参照してください。

構造体指定子

構造体を利用するには、最初に構造体を宣言しなければなりません。構造体は、異なるデータ型の変数の集合であり、構造体に含まれる個々の変数のことをメンバと呼びます。構造体を宣言するには、構造体指定子を用います。構造体指定子は、intやdoubleと同じ型指定子の一種です。

struct 識別子opt { メンバ宣言並び }

structキーワードが構造体であることを表し、直後の識別子で、この構造体の型を表すことができます。識別子は省略可能で、再利用しない構造体であれば識別子を明記する必要はありません。その後、宣言する構造体が持つ変数の型と名前を { } に囲まれたメンバ宣言並びで指定します。

メンバ宣言並びは、構造体が持つ変数を記述するメンバ宣言を並べたものです。メンバ宣言は、通常の変数と同じように、型指定子と識別子の並びです。メンバ宣言の末尾は、必ずセミコロン ; で終わります。文字型と整数型を持つ構造体指定子は、次のようになるでしょう。

struct { char member1; int member2; } obj;

上記は、文字型のメンバmember1と、整数型のメンバmember2を持つ構造体指定子を用いて、文字型と整数型を含む構造体型の変数objを作成しています。obj変数は、構造体指定子に従ってchar型のmember1とint型のmember2というメンバを含んでいます。よって、obj変数の記憶領域はchar + intという形で構成されています。

基本的なメンバの宣言方法は、単一の変数宣言と同じなので、同じ型のメンバであれば、カンマで区切って複数のメンバを同時に宣言できます。

struct { int x, y; } obj;

上記の宣言は、int 型のメンバxとyをカンマで区切って同時に宣言しています。これは、以下の宣言と同じです。

struct { int x; int y; } obj;

構造体に指定するメンバの数は任意ですが、1行で書くと長くなってしまうため、ブロック文のように { } 内のインデントを深くしてメンバ単位で改行する記法が一般的です。

struct
{
    char member1;
    int member2;
    double member3;
    ...
} obj ;

これが、一般的な構造体の宣言となります。