結構體和共同體


結構體
定義多個不同類型的成員變量組合在一起,以實現復雜的數據結構。
格式:
 
struct [標簽名]  { 
    類型    變量名;
    類型    變量名;
    ...
} [ 變量1={初始化},  變量2 ...];
 
或者:
 
typedef struct{
 
    類型    變量名;
    類型    變量名;
    ...
} [標簽名];
 
示例:
 
struct Books {
 
   int   id;
   char  title[50];
   char  author[50];
   
} book;
 
 
當兩個結構體互相包含,則需要對其中一個結構體進行聲明:
 
//聲明
struct B; 
 
//結構體A指向結構體B
struct A{
    struct B *partner;
};
 
struct B{
    struct A *partner;
};
 
 
位域
有些信息在存儲時,並不需要占用一個完整數據空間,而只需占幾個或一個二進制位。所謂"位域"是把字節中的二進位划分為幾個不同的區域,並說明每個區域的位數。
格式:整型  變量名 : 寬度
 
struct {
    int  a:8;
    unsigned  b:16; //等同於 unsigned int
    int  :4;    // 空域,會空出4位的空間
    signed char  c;//char 保存的也是整數
    
} code;
 
值得注意的是寬度表示是的所占二進制位,不能超過它自身的類型。
如: char 占1個字節,也就是8位,所以寬度不能超過8,即: char a:9 會報錯。
如: int 占4個字節,也就是32位,所以寬度不能超過32,即: int a:33 會報錯。
 
整個結構體所占內存大小是最大的那數據類型的整數倍.
{
int  a:32;
char b:8;
}
共計 32 + 8 = 40 / 8 = 5字節,而成員變量中占用空間最大的是int型,一個int占4個字節,而4個字節存不下,得再擴展一個int空間,所以就占8個字節了。可以通過 sizeof(變量) 去驗證結果;
 
共用體
定義多個不同類型的成員變量共用相同的內存空間,而內存空間只能輪流使用,內存空間大小取決於最大的那個成員變量。
 
union [標簽名] {
 
    類型    變量名;
    類型    變量名;
    ...
    
} [變量1, 變量2 ...];
 
示例:
union Student {
 
   char  name[10];
   int age;
   float weight;
   
} boy;
 
 
int main( ) {
 
   //正確使用
   boy.name = "Tom";
    printf( "男孩名字: %s \n", boy.name);
    
   boy.age = 20;
   printf( "男孩年齡: %d \n", boy.age);
   
   boy.weight = 64.5
   printf( "男孩體重: %f \n", boy.weight);
 
   //錯誤使用
   union Student girl; 
   girl.name = "Ailsa";
   girl.age = 20;
   girl.weight = 46.5
   
   printf( "女孩: %s  %d  %f \n", girl.name, girl.age, girl.weight);
  
}

 


免責聲明!

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



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