3 構造体の文法

教科書は分かり易く書かれているが、説明不足の所がある。そこで、退屈ではあるが細か い説明をしておく。

3.1 構造体型の定義

3.1.1 基礎

構造体は、メンバーと呼ばれる変数の集合体の型である。プログラマーが新たに型を定義 するようなものである。定義の方法は、一般的には次のようになる。
	struct タグ名 {
	  型 メンバー1名;
	  型 メンバー2名;
	  型 メンバー3名;
	  ・
	  ・
	  ・
	  型 メンバーN名;
	} 変数リスト;
予約語(キーワード)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;;
となる。この場合は、新たにこの型の構造体変数を追加することができないので、不便な 場合がある。変数の数があらかじめ分かっている場合に使われる。

3.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];
と書き、変数を使うこともできる。

3.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段でも可能である。

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

構造体のメンバーの参照には、.演算子 (ドット演算子)をつかう。次のようにする のである。
構造体変数.メンバー                           /* 通常 */
構造体変数.メンバー.メンバー                   /* メンバーが構造体 */
構造体変数.メンバー.メンバー.メンバー           /* メンバーのメンバーも構造体*/
構造体変数[配列の添え字].メンバー               /* 構造体が配列*/
構造体変数.メンバー[配列の添え字]               /* メンバーが配列*/
構造体変数[配列の添え字].メンバー[配列の添え字]   /*構造体もメンバーも配列*/
ようするに、構造体といえども、ドット演算子を使う以外は通常の変数とほとんど同じで ある。それでは、実際のプログラム例で、それを見てみよう。
	#include <stdio.h>
	#include <string.h>

	struct seiseki{
	  int mathematics;
	  int english;
	};

	struct gakusei{
	  char name[80];
	  struct seiseki test;
	  double height;
	};

	int main(){

	  struct gakusei e2[10];

	  strcpy(e2[0].name,"yamamoto");
	  e2[0].test.mathematics = 95;
	  e2[0].test.english = 65;
	  e2[0].height = 174.8;

	  printf("%s\n", e2[0].name);
	  printf("  Mathematics : %d\n", e2[0].test.mathematics);
	  printf("  English     : %d\n", e2[0].test.english);
	  printf("  Height      : %f [cm]\n", e2[0].height);

	  return 0;
	}

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

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

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




ホームページ: Yamamoto's laboratory
著者: 山本昌志
yamamoto masashi
平成17年5月14日


no counter