2 構造体とユーザー定義型

2.1 宣言と定義,アクセス

関連のあるデータをひとつにまとめることが構造体の役割である.例えば,ある学生の試 験成績管理するばあい,(1)名前 (2)数学の成績 (3)英語の成績のようなデータが必要で あろう.整数だけであれば,配列を使うことも考えられるが,名前も合わせて管理すると なると不可能である.

構造体の宣言は,次のようする.

	typedef struct{
	  char name[64];
	  int math;
	  int engl;
	}seiseki;

いろいろな宣言の方法があるが,typedefを使う方法が一般的である.これは便利な ので,諸君はこれを使うように心がけよ.これで,seiseki型の構造体を決めたこと になる.ただ,これは構造体を決めただけ--コンパイラーにこのような型の構造体があ ると知らせただけ--でメモリーの確保は行われていない.

メモリーの確保を行うためには,次のように型名と変数名を指定して変数の定義を行わなくてはなら ない.

	  seiseki gakusei;

これで,seiseki型の構造体が格納できるメモリーがひとつ確保でき,変数 gakuseiが使用できるようになる.

この構造体には,namemathenglの3つのメンバーがある.これら3つ のメンバーにアクセスするためには,ドット演算子(.)を使う.

	  strcpy(gakusei.name, "Yamamda Masashi");
	  gakusei.math = 92;
	  gakusei.engl = 78;

このようにして,ドット演算子を使い構造体のメンバーを指定して,値を代入することが できる.値を取り出すときもドット演算子を使う.

宣言と定義について これまで宣言(declaration)と定義(definition)という語句をいい加減に使っ てきた.これをはっきりさせておく必要がある.宣言とはオブジェクトの型を指定する ことである.定義とは,オブジェクト型を指定し必要な記憶領域を確保することである.

2.2 応用

構造体の配列を使うと,応用が拡がる.例えば,先ほどのseiseki型の構造体を使っ て,秋田高専の2年生4学科(各40人とする)の成績を管理することを考える.次のように構 造体の配列を定義すればよい.
	  seiseki M2[40], E2[40], C2[40], B2[40];

配列の場合も同じようにドット演算子を使って,アクセスできる.

	  strcpy(E2[5].name, "Itoh Misaki");
	  E2[5].math = 89;
	  E2[5].engl = 96;

2.3 プログラム例


   1 #include <stdio.h>
   2 #include <string.h>
   3 
   4 int main(void)
   5 {
   6 
   7   typedef struct{
   8     char name[64];
   9     int math;
  10     int engl;
  11   }seiseki;
  12 
  13   seiseki gakusei;
  14 
  15   strcpy(gakusei.name, "Yamamda Masashi");
  16   gakusei.math = 92;
  17   gakusei.engl = 78;
  18 
  19   printf("Name:\t\t%s\n", gakusei.name);
  20   printf("Mathmatics:\t%d\n", gakusei.math);
  21   printf("English:\t%d\n", gakusei.engl);
  22 
  23   return 0;
  24 }


\fbox{実行結果}
Name:           Yamamda Masashi
Mathmatics:     92
English:        78



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


no counter