第15章 構造体
15.1 構造体の機能
/* 構造体とは */
省略
/* 構造体の定義 */
15_15-1
/* クラスと構造体 */
省略
/* 構造体メンバと一般変数は別管理 */
省略
/* 構造体名と一般変数名は別管理 */
省略
/* 構造体型の変数の宣言 */
(1)構造体の構造を定義してから、その構造体をもつ変数を宣言する
struct Seito { // まずSeito型を決め
string name;
int kokugo;
int sansuu;
};
Seito a; // Seito型の変数aを使用することを宣言
(2)定義のときに変数名も指定する
struct Seito { // 構造体名と
string name;
int kokugo;
int sansuu;
} a; // 変数を同時に指定。a,b,c;のように複数指定も可
(3)構造体名の省略
struct {
string name;
int kokugo;
int sansuu;
}a; // その構造の変数aを宣言
/* 構造体定義の位置 */
省略
/* 構造体メンバの指定 */
Seito a; // Seito型の変数a
Seito *p = &a; // Seito型のポインタp
a.kokugo = 80; // 変数には.を使う
p->kokugo = 80; // ポインタには->を使う
/* 構造体の配列 */
Seito dt[10]; // 配列を宣言
dt[2].name = "田中一郎";
dt[2].sansuu = 80;
dt[2].kokugo = 90;
dt[5] = dt[2];
/* 構造体の初期化 */
(1)単独の初期化
Seito a = {"田中一郎", 70, 80}; // 内容は("田中一郎",70,80)
Seito b = {"鈴木二郎", 90}; // 内容は("鈴木二郎",90,0)
(2)構造体定義時の初期化
struct Seito {
string name;
int kokugo;
int sansuu;
} sdt = {"田中一郎", 70, 80};
(3)配列の初期化
Seito sdt[4] = {
{"田中一郎", 50, 55},
{"伊藤二郎", 60, 65},
{"鈴木三郎", 70, 75},
{"藤田四郎", 80, 85}
};
 
15.2 構造体の演算
(1)構造体同士のコピー
Seito a, b, dt[10];
b = a;
dt[2] = dt[4];
(2)構造体のアドレスを取り出す
Seito sdt, meibo[100];
Seito *p1, *p2;
p1 = &sdt;
p2 = meibo;
(3)メンバを参照する
Seito a;
Seito *p = &a;
a.kokugo = 80;
p->sansuu = 90;
 
15.3 構造体変数の関数との受け渡し
/* 関数に構造体を渡す */
15_15-2
/* 関数から構造体を受け取る */
15_15-3
 
15.4 入れ子の構造体
struct Kakakutyp {
int teika; // 定価
int waribiki; // 割引価格
int yuutai; // 優待価格
};
struct Syohin {
string name; // 商品名
Kakakutyp kakaku; // 価格構造体
int zaiko; // 在庫数
};
Syohin syo;
Syohin *sp = &syo;
syo.kakaku.teika = 8000; // 変数の場合の定価設定
sp->kakaku.teika = 8000; // ポインタの場合の定価設定
struct Syohin {
string name;
struct Kakakutyp {
int teika;
int waribiki;
int yuutai;
} kakaku;
int zaiko;
}
15_15-4
 
15.5 自己参照構造体
/* 自分を指すポインタを含む */
省略
/* データのチェーンを作る */
省略
/* 自己参照構造体の宣言 */
struct Person {
string name;
int age;
Person* next;
}
/* 自己参照構造体モデル */
15_15-5
/* 双方向チェーンの自己参照構造体 */
struct Person {
string name;
int age;
Person *before;
Person *next;
}