「配列」は「同じ型」の変数をたくさんまとめて使いたい場合に用い, 各要素に「番号」でアクセスする.
「構造体」を使うと,「異なる型」をまとめて使ったり, その各要素(メンバという)を「名前」でアクセスできる.
構造体を使うには2段階の宣言が必要.
「構造体テンプレート」の宣言と「構造体変数」の宣言.
struct タグ名 {
型名1 メンバ名1;
型名2 メンバ名2;
...;
};
(例) 2次元ベクトル
struct vector {
double x;
double y;
};
(例) 個人データ
struct personal {
int age;
double height;
double weight;
char name[20];
};
構造体テンプレート宣言はデータ形式を定義しただけ,
実際に記憶する領域はまだ用意されない.
struct タグ名 構造体変数名;
(例)
struct vector v1, v2, v3;
struct personal hosoi, matsui, miyazaki, matsushita;
構造体変数を宣言することによって初めて記憶領域が用意され, 実際に構造体を使うことができる.
タグ名を省略して,テンプレートと変数の宣言を同時に行うこともできるが, あまり使わない(覚えなくてよい).
struct {
型名1 メンバ名1;
型名2 メンバ名2;
...;
} 構造体変数名;
struct {
double x;
double y;
} v1, v2, v3;
構造体変数名.メンバ名
この形式で,各メンバに対する代入と参照ができる.
(例)
struct vector v1, v2;
v1.x = 200.0;
v1.y = 300.0;
v2.x = 3.0*v1.x;
v2.y = 3.0*v1.y;
(例)
struct personal a;
a.age = 22;
a.height = 178.0;
a.weight = 65.0;
strcpy(a.name, "Nishikawa");
/* strcpy()は文字列のコピーを行う標準ライブラリ関数 */
struct seiseki { 構造体テンプレートの宣言
int sugaku;
int eigo;
int kokugo;
int kesseki;
double heikin;
int gokaku;
};
.....
struct seiseki ichiro, jiro; 構造体変数の宣言
struct タグ名 構造体変数名 = {メンバ1の値, メンバ2の値, ...};
配列の場合と同じように波括弧を用いたこの書式は初期値の設定にしか使えない.
(例)
struct vector v = {1.0, 2.0};
struct personal a = {20, 175.3, 65.1, "木曾幸太郎"};
(例)
struct vector v1, v2, v3;
v1.x = 10.0;
v1.y = 20.0;
v2 = v1; ← 可能
v3 = v1 + v2; ← 許されない (「+」が不可)
(例)
double v1[2], v2[2], v3[2];
v1[0] = 10.0;
v1[1] = 20.0;
v2 = v1; ← 許されない.
v3 = v1 + v2; ← 許されない.
(例)
struct point { /* 2次元空間の点 */
double x;
double y;
};
struct segment { /* 2次元空間の線分 */
struct point start
struct point end;
};
struct segment a;
a.start.x = 1.0;
a.start.y = 2.0;
a.end.x = a.start.x + 10.0;
a.end.y = a.start.y + 10.0;
struct タグ名 構造体配列名[要素数];
要素数が多い場合は,staticを前に付加して,静的変数として定義するべきである.
自動変数の領域はあまり大きくないからである.
(例)
struct vector v[10];
static struct personal table[100];
struct seiseki { 構造体テンプレートの宣言
int sugaku;
int eigo;
int kokugo;
int kesseki;
double heikin;
int gokaku;
};
.....
static struct seiseki seito[DMAX]; 構造体配列変数の宣言
(容量が大きいので静的に領域確保)
struct seiseki 構造体を戻り値とする関数
nyuryoku(void)
{
.....
}
void
hantei(struct seiseki a[], int n) 構造体の配列を引数とする関数
{
.....
}
void
hyoji(struct seiseki s) 構造体を引数とする関数
{
.....
}