struct與 union的基本用法


結構體與聯合體是C語言的常見數據類型,可對C的基本數據類型進行組合使之能表示復雜的數據結構,意義深遠,是優異代碼的必備工具。
一.        struct與 union的基本用法,在語法上union與struct相同,因此只以struct為例
1.1        基本用法:

  1. struct AA{ int a; int b;}; //結構體的聲明和定義
  2. struct AA s1; //變量的聲明和定義 
  3. s1.a=3; //變量的使用:
復制代碼

1.2        在聲明結構體的同時定義變量:

  1. struct AA{int a; int b}s2={1, 2}; //此處AA為可選項,初始化部分為可選
  2. s2.a=5;                 //變量的使用
復制代碼

1.3        使用 typedef 來簡化struct的類型說明:

  1. typedef struct AA{int a; int b;}SAA; 
  2. SAA s3, s4;         //變量的聲明和定義
  3. s3.a=8; //變量的使用
復制代碼

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標准中提及的匿名結構(聯合)體應該只適用於有名結構體(聯合)中的匿名結構(聯合)體成員)

  1. struct v{
  2.         union{ //匿名聯合體
  3.                 struct {int i, j;}; //匿名結構體
  4.                 struct {long k, l;}w;
  5.         };
  6.         int m;
  7. }v1;
  8. v1.i=2; //合法,匿名結構體的成員被直接使用
  9. v1.k=3;//非法,有名字的結構體需要引用他的名字,如下
  10. v1.w.k=5; //合法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM