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型の構造体変数の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段でも可能である.
構造体変数.メンバー /* 通常 */ 構造体変数.メンバー.メンバー /* メンバーが構造体 */ 構造体変数.メンバー.メンバー.メンバー /* メンバーのメンバーも構造体*/ 構造体変数[配列の添え字].メンバー /* 構造体が配列*/ 構造体変数.メンバー[配列の添え字] /* メンバーが配列*/ 構造体変数[配列の添え字].メンバー[配列の添え字] /*構造体もメンバーも配列*/ようするに,構造体といえども,ドット演算子を使う以外は通常の変数とほとんど同じで ある.それでは,実際のプログラム例で,それを見てみよう.
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 }
yamamoto Mathematics : 95 English : 65 Height : 174.800000 [cm]
構造体は通常の変数のように取り扱うことができるので,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;