4. 嵌套结构体

结构体也是一种递归定义:结构体由数据类型定义,因为结构体的成员具有数据类型,而数据类型由结构体定义,因为结构体本身也是一种数据类型。换句话说,结构体也可以嵌套。例如我们在复数的基础上定义复平面上的线段:

struct Segment {
	struct complex_struct start;
	struct complex_struct end;
};

嵌套结构体可以嵌套地初始化。例如:

struct Segment s = {{ 1.0, 2.0 }, { 4.0, 6.0 }};

也可以平坦地初始化。例如:

struct Segment s = { 1.0, 2.0, 4.0, 6.0 };

甚至可以混合地初始化(这样可读性很差,应避免使用):

struct Segment s = {{ 1.0, 2.0 }, 4.0, 6.0 };

访问嵌套结构体的成员应该用多个.运算符,这也是意料之中的:

s.start.t = RECTANGULAR;
s.start.a = 1.0;
s.start.b = 2.0;