4 構造体の文法

4.1 構造体型の宣言(構造体テンプレート)

4.1.1 基礎

構造体は,メンバーと呼ばれる変数が集合した型である.プログラマーが新たに型を定義 するようなものである.定義の方法は,一般的には次のようになる.
	struct タグ名 {
	  型 メンバー名;
	  型 メンバー名;
	  型 メンバー名;
	  ・
	  ・
	  ・
	  型 メンバー名;
	} 変数リスト;
予約語(キーワード)structは,構造体を定義するとコンパイラーに伝える役目があ る.タグ名と言うのは,新たに定義した構造体の名前である.型を定義するのであるから, その型の名前が必要となる.型は,メンバーの型を示す.これは,C言語で使うこと ができる通常の型である.たとえば,int, double, char等で,構造体も メンバーの型として,使える.メンバー名は,構造体を構成する変数の名前で,そのデー タにアクセスするために必要である.変数リストは,ここで定義された構造体を使う場合 の変数名である.

タグ名と変数リストのどちらか一方は省略可能である.タグ名を省略すると構造体の型名 が無くなるので,その内容がわかりにくくなり,通常は省略しない.一方,変数リストが 省略されることは,しばしば生じる.

それでは,例として学生の名前と成績,身長,体重を示した構造体を定義してみる.

	struct gakusei{
	  char name[80];
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	  double height;
	  double weight;
	} sato, tanaka, yamamoto;
これで,gakusei型の構造体変数のsatotanakayamamotoが使え るようになる.さらに,watanabeという変数を追加したい場合は,
	struct gakusei watanabe;
とすればよい.

変数リストを省略すると,

	struct gakusei{
	  char name[80];
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	  double height;
	  double weight;
	};
となる.こうすると,このgakusei型の構造体変数を使うためには,
	struct gakusei sato, tanaka, yamamoto;
のようにプログラム中で書く必要がある.

一方,タグ名を省略すると,

	struct {
	  char name[80];
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	  double height;
	  double weight;
	} sato, tanaka, yamamoto;;
となる.この場合は,新たにこの型の構造体変数を追加することができないので,不便な 場合がある.変数の数があらかじめ分かっている場合に使われる.

4.1.2 変数を配列に

先の例だと,学生数が多くなると不便になる.多くのデータを扱う場合は配列が便利なの は以前述べたとおりで,ここでもそれが使える.たとえば,クラス毎に
	struct gakusei{
	  char name[80];
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	  double height;
	  double weight;
	} M2[50], E2[50], C2[50], B2[50];
とする事ができる.

変数リストを省略して,

	struct gakusei{
	  char name[80];
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	  double height;
	  double weight;
	};
と構造体を定義して,プログラム中で,
	struct gakusei M2[50], E2[50], C2[50], B2[50];
と書き,変数を使うこともできる.

4.1.3 メンバーを構造体型に

先のデータを見ると,成績を表すメンバー(mathematics, english, japanese, electrical_eng, info_eng)は似たようなデータで関連が強い.これは一つにまとめる とデータの内容が分かり易くなり,プログラムの見通しが良くなる.そのためには,次に 示すように構造体のメンバーを使えば良い.
	struct seiseki{
	  int mathematics;
	  int english;
	  int japanese;
	  int electrical_eng;
	  int info_eng;
	};

	struct gakusei{
	  char name[80];
	  struct seiseki test;
	  double height;
	  double weight;
	};
このように入れ子にすることを,構造体のネストと言う.ここでは2段のネストであるが, 3段でも4段でも可能である.

4.2 構造体型のメンバーの参照

構造体のメンバーの参照--アクセス--には,.演算子 (ドット演算子)をつかう.次のようにする のである.
構造体変数.メンバー                           /* 通常 */
構造体変数.メンバー.メンバー                   /* メンバーが構造体 */
構造体変数.メンバー.メンバー.メンバー           /* メンバーのメンバーも構造体*/
構造体変数[配列の添え字].メンバー               /* 構造体が配列*/
構造体変数.メンバー[配列の添え字]               /* メンバーが配列*/
構造体変数[配列の添え字].メンバー[配列の添え字]   /*構造体もメンバーも配列*/
ようするに,構造体といえども,ドット演算子を使う以外は通常の変数とほとんど同じで ある.それでは,実際のプログラム例で,それを見てみよう.
   1 #include <stdio.h>
   2 #include <string.h>
   3 
   4 struct seiseki{      //構造体テンプレート(成績)
   5   int mathematics;
   6   int english;
   7 };
   8 
   9 struct gakusei{      //構造体テンプレート(学生)
  10   char name[80];
  11   struct seiseki test;
  12   double height;
  13 };
  14 
  15 //=========================================================
  16 //  メイン関数
  17 //=========================================================
  18 int main(void)
  19 {
  20 
  21   struct gakusei E2[10];      //構造体を使う
  22 
  23   strcpy(E2[0].name,"yamamoto");
  24   E2[0].test.mathematics = 95;
  25   E2[0].test.english = 65;
  26   E2[0].height = 174.8;
  27 
  28   printf("%s\n", E2[0].name);
  29   printf("  Mathematics : %d\n", E2[0].test.mathematics);
  30   printf("  English     : %d\n", E2[0].test.english);
  31   printf("  Height      : %f [cm]\n", E2[0].height);
  32 
  33   return 0;
  34 }


\fbox{実行結果}
yamamoto
  Mathematics : 95
  English     : 65
  Height      : 174.800000 [cm]

構造体は通常の変数のように取り扱うことができるので,scanfをつかって,キーボー ドからデータを読み込む場合は,次のようにする.先ほどのプログラムで,キーボードか ら入力された値をメンバーのmathematicsに格納するためには次のようにする.

	scanf("%d",&E2[0].test.mathematics);
 
通常の変数同様,格納する変数(ここではメンバー)の頭に&をつけるだけである.

4.3 構造体型を使うときの注意




ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年4月10日


no counter