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型の構造体変数のsatoとtanaka、yamamotoが使え るようになる。さらに、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;;となる。この場合は、新たにこの型の構造体変数を追加することができないので、不便な 場合がある。変数の数があらかじめ分かっている場合に使われる。
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];と書き、変数を使うこともできる。
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段でも可能である。
構造体変数.メンバー /* 通常 */ 構造体変数.メンバー.メンバー /* メンバーが構造体 */ 構造体変数.メンバー.メンバー.メンバー /* メンバーのメンバーも構造体*/ 構造体変数[配列の添え字].メンバー /* 構造体が配列*/ 構造体変数.メンバー[配列の添え字] /* メンバーが配列*/ 構造体変数[配列の添え字].メンバー[配列の添え字] /*構造体もメンバーも配列*/ようするに、構造体といえども、ドット演算子を使う以外は通常の変数とほとんど同じで ある。それでは、実際のプログラム例で、それを見てみよう。
#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);通常の変数同様、格納する変数(ここではメンバー)の頭に&をつけるだけである。
struct seisu{ int i; int j; }; struct seisu k,l; int i,j;
struct seisu{ int i; int j; }; struct seisu k={1,2}; struct seisu l[2]={{3,4},{5,6}};
struct seisu{ int i; int j; }; struct seisu k, l={1,2}; k=l;