第30回
データ構造(9)~構造体の基本

構造体で変数をまとめる

複数の関連するデータを扱うのに、単純な配列では無理が生じます。そこで、1人分の複数の変数を1つにまとめ、それらをあたかも1つの変数のように扱うことが考えられます。それが構造体です。構造体については、本コラムの第20回「いろいろな演算子~演算子の優先順位」でその概要を紹介しました。今回はもう少し詳しく解説しましょう。

構造体の定義~struct構造体指定子

構造体はstruct命令で定義します。struct命令は「構造体指定子」とも呼ばれます。

struct <タグ> {
  <変数宣言>
      :
};

<タグ>とはtag(荷札)のことで、定義する構造体の識別名となります。先ほどの社員の情報を“_staff”という名前の構造体として定義するなら、以下のように記述します。
struct _staff {
  int    id;             /* 社員番号 */
  char   name[64 + 1];   /* 氏名 */
  int    gender;         /* 性別(0 / 1) */
  char   birth[10 + 1];  /* 生年月日(yyyy/mm/dd) */
  int    sect;           /* 所属ID */
};

これで“struct _staff”という名前の構造体が定義されます。“struct _staff”という名前(識別子)は{ }内に列挙された複数の変数を包含しています。id、nameなど構造体を構成する個々の変数を「メンバ(member)」と呼びます。

新しい型の定義

こうして定義した構造体はintやfloatなどと同じ『1つの型』として扱えます。struct _staff型の変数“staff”を宣言するなら、以下のように記述します。
struct _staff staff;

“struct _staff”が型名、“staff”がその型の変数名です。構造体はこのように「struct ~」という形で識別するため、記述がやや煩雑になります。

定義した構造体型の変数を一度きりしか宣言しないのであれば、以下のように構造体の定義と変数の宣言をまとめて記述することもできます。こうすれば、タグの指定を省略できます。
struct {
  int    id;
  char   name[64 + 1];
  int    gender;
  char   birth[10 + 1];
  int    sect;
} staff;

タグを省略し、構造体定義の最後にある“ } ”に続けて変数名を記述するわけです。以下のようにして、複数の変数を宣言することもできます。
struct {
  int    id;
      : (略)
} staff1, staff2, staff3;

あるいは、配列としても構いません。
struct {
  int    id;
      : (略)
} staff[10];