結構體也是一種遞歸定義:結構體的成員具有某種數據類型,而結構體本身也是一種數據類型。換句話說,結構體的成員可以是另一個結構體,即結構體可以嵌套定義。例如我們在複數的基礎上定義復平面上的線段:
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;