4. 嵌套结构体

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

struct segment {
	struct complex_struct start;
	struct complex_struct end;
};

第 1 节 “复合类型与结构体”讲的Initializer的语法可以看出,Initializer也可以嵌套,因此嵌套结构体可以嵌套地初始化,例如:

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

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

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

甚至可以把两种方式混合使用(这样可读性很差,应该避免):

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

利用C99的新特性也可以做Memberwise Initialization,例如[15]

struct segment s = { .start.x = 1.0, .end.x = 2.0 };

访问嵌套结构体的成员要用到多个.运算符,例如:

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


[15] 为了便于理解,第 1 节 “复合类型与结构体”讲的Initializer语法并没有描述这种复杂的用法。