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;