4. 嵌套结构体
结构体也是一种递归定义:结构体的成员具有某种数据类型,而结构体本身也是一种数据类型。换句话说,结构体的成员可以是另一个结构体,即结构体可以嵌套定义。例如我们在复数的基础上定义复平面上的线段:
c
struct segment {
struct complex_struct start;
struct complex_struct end;
};从 第 1 节“复合类型与结构体” 讲的 Initializer 的语法可以看出,Initializer 也可以嵌套,因此嵌套结构体可以嵌套地初始化,例如:
c
struct segment s = {{ 1.0, 2.0 }, { 4.0, 6.0 }};也可以平坦(Flat)地初始化。例如:
c
struct segment s = { 1.0, 2.0, 4.0, 6.0 };甚至可以把两种方式混合使用(这样可读性很差,应该避免):
c
struct segment s = {{ 1.0, 2.0 }, 4.0, 6.0 };利用 C99 的新特性也可以做 Memberwise Initialization,例如 [1]:
c
struct segment s = { .start.x = 1.0, .end.x = 2.0 };访问嵌套结构体的成员要用到多个。运算符,例如:
c
s.start.t = RECTANGULAR;
s.start.a = 1.0;
s.start.b = 2.0;为了便于理解,第 1 节“复合类型与结构体” 讲的 Initializer 语法并没有描述这种复杂的用法。 ↩︎