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语法并没有描述这种复杂的用法。