結構體與聯合體是C語言的常見數據類型,可對C的基本數據類型進行組合使之能表示復雜的數據結構,意義深遠,是優異代碼的必備工具。
一. struct與 union的基本用法,在語法上union與struct相同,因此只以struct為例
1.1 基本用法:
1.2 在聲明結構體的同時定義變量:
1.3 使用 typedef 來簡化struct的類型說明:
1.4 使用時尤其注意后面的分號,必不可少;
二. struct 與 union的區別
2.1 struct中的成員是按順序依次排列,互相獨立,在排列時引入了對齊問題(2.2);而union中的成員共用一塊內存,起始地址都是相同的,即union中的成員是對同一地址的多個引用、對同一地址的多種表達方法。
2.2 struct的對齊問題
對齊問題即struct中每個成員起始地址的分配。為了可以快速訪問到每個成員,(以EW430為例)編譯器根據成員的類型放到合適的地址上,默認為2字節對齊。如:
Struct AA{char c; int d;}aa;
假設aa被分配在地址N上,並且N為偶數,則aa.c的地址為N,aa.d的地址為N+2,而N+1地址未使用被浪費了。
對齊字節大小的指定:通過#pragma pack(n)來指定對齊字節的大小,n為某些常量(EW430中可取1,2,4,8,16),指定以n字節對齊。通常使用編譯器默認的對齊大小最為適宜。如果指定對齊大小為1字節對齊,以上面的結構體變量aa為例,aa.c地址為N,aa.d地址為N+1,是個奇數地址,因為430在奇數地址只能讀取一個字節,因此要訪問d成員需要讀取兩次才能完成,后果是代碼變長、速度變慢。
三. 匿名結構體與聯合體
匿名結構體和聯合體,即沒有名字的結構體或者聯合體,這種結構體(或聯合體)無法通過.與->操作符引用(因為它所屬的結構體或聯合體沒有名字,無法應用),而像暴露在外面一樣,與外層作用域相同,可直接使用。
3.1 C標准中提及的匿名結構體和聯合體(草稿原文引用)(C標准中提及的匿名結構(聯合)體應該只適用於有名結構體(聯合)中的匿名結構(聯合)體成員)
