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;