结构体也是一种递归定义:结构体的成员具有某种数据类型,而结构体本身也是一种数据类型。换句话说,结构体的成员可以是另一个结构体,即结构体可以嵌套定义。例如我们在复数的基础上定义复平面上的线段:
struct segment { struct complex_struct start; struct complex_struct end; };
从第 1 节 “复合类型与结构体”讲的Initializer的语法可以看出,Initializer也可以嵌套,因此嵌套结构体可以嵌套地初始化,例如:
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 };
利用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;