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語法並沒有描述這種複雜的用法。