導入
3人分、10人分の Person を扱いたいとき、p1, p2, p3 と変数を増やすのは大変です。構造体は普通の型と同じように配列にできます。また、構造体の中に別の構造体を入れる**ネスト(入れ子)**もよく使われます。
説明
構造体の配列は、int の配列と同じ書き方で作れます。
#include <stdio.h>
struct Point {
int x;
int y;
};
struct Rect {
struct Point topLeft;
struct Point bottomRight;
};
int main(void) {
struct Point pts[3] = {{0, 0}, {1, 2}, {3, 4}};
int i;
for (i = 0; i < 3; i++) {
printf("(%d,%d)\n", pts[i].x, pts[i].y);
}
struct Rect r = {{0, 0}, {10, 5}}; // 構造体の中に構造体(ネスト)
int width = r.bottomRight.x - r.topLeft.x;
int height = r.bottomRight.y - r.topLeft.y;
printf("width=%d height=%d\n", width, height);
return 0;
}
struct Rect は struct Point を2つメンバに持つ「入れ子」の構造体です。r.topLeft.x のように . を2回連続で書くと、外側→内側とたどってメンバに届きます。
flowchart LR r["struct Rect r"] --> tl["topLeft(struct Point)<br/>x=0, y=0"] r --> br["bottomRight(struct Point)<br/>x=10, y=5"] tl -->|"r.topLeft.x のように<br/>ドットを2回たどる"| tlx["x = 0"]
やってみよう
pts の要素数を4つに増やしてみたり、Rect の座標を変えて width/height が変わることを確かめましょう。
演習
struct Point pts[3] に (2,3)、(5,7)、(-1,4) を入れ、for ループで各点の x + y を合計して total に足し込み、printf("合計=%d\n", total); の形で表示してください(正しく書けると 合計=20 になります)。
ヒント1を見る
struct Point pts[3] = {{2,3},{5,7},{-1,4}}; のように初期化します。
ヒント2を見る
ループの中で total += pts[i].x + pts[i].y; を足していきます。