Can you summarize the following document?
        
  結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標誌,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體宣告的變數。  在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。以下為示例:  在上面的宣告中,第一個和第二宣告被編譯器當作兩個完全不同的型別,即使他們的成員列表是一樣的,如果令t3=&s1,則是非法的。  結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的指標,而通常這種指標的應用是為了實現一些更高階的資料結構如連結串列和樹等。  如果兩個結構體互相包含,則需要對其中一個結構體進行不完整宣告,如下所示:

  結構體成員依據結構體變數型別的不同,一般有2種訪問方式,一種為直接訪問,一種為間接訪問。直接訪問應用於普通的結構體變數,間接訪問應用於指向結構體變數的指標。直接訪問使用結構體變數名.成員名,間接訪問使用(*結構體指標名).成員名或者使用結構體指標名->成員名。相同的成員名稱依靠不同的變數字首區分。

  在記憶體中,編譯器按照成員列表順序分別為每個結構體變數成員分配記憶體,當儲存過程中需要滿足邊界對齊的要求時,編譯器會在成員之間留下額外的記憶體空間。如果想確認結構體佔多少儲存空間,則使用關鍵字sizeof,如果想得知結構體的某個特定成員在結構體的位置,則使用offsetof巨集(定義於stddef.h)。

  匿名struct、匿名union以及C++的匿名class,是指既沒有型別名,也沒有直接用這種型別定義了物件;如果緊隨型別定義之後,又定義了該型別的物件,就不算是匿名型別,與普通情形的使用是一樣的。  匿名型別作為巢狀定義,即在一個外部類(這裡的類是指struct、union、class)的內部定義,則編譯器就在匿名型別定義之後定義一個無名變數,並把該匿名型別的資料成員的名字提升到匿名類的外部類的作用域內。如果匿名型別是連續巢狀,則最內部的匿名型別的成員名字被提升到最外部的可用變數名字訪問的類的作用域內。  例如,
在C語言中,結構體(struct)指的是一種資料結構,是C語言中複合資料型別(aggregate data type)的一類。結構體可以被宣告為變數、指標或陣列等,用以實現較複雜的資料結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的型別,成員一般用名字訪問。