自定義類型

>結構體類型創建

結構體類型創建
結構體是一些(具有相同或不同元素類型)值的集合,這些值成爲成員變量。
結構體的每個成員可以是不同類型的變量 。
結構體的聲明:
例:(描述一個學生)
[html] view plain copy
  1. struct Stu  
  2. {  
  3.     char name[20];  
  4.     int age;  
  5. };//分號不能丟  
結構體的成員可以是標量、數組、指針,甚至可以使其他結構體。

>結構體初始化

  1. //1.定義的同時初始化  
  2.     struct Person p1 = {"zhangsan",20,170};  
  3.       
  4.     //2.先定義再逐個初始化  
  5.     struct Person p2;  
  6.     p2.name = "ykd";  
  7.     p2.age = 18;  
  8.     p2.heigth = 180;  
  9.       
  10.     //3.先定義再一次性初始化  
  11.     struct Person p3;  
  12.     p3 = (struct Person){"lisi",18,180};  
  13.       
  14.     //注意:結構體和數組在這裏的區別,數組不能先定義再進行一次性初始化  
  15.     //結構體要明確的告訴系統{}中是一個結構體  
  16.       
  17.     //4.指定將數據賦值給指定的屬性  
  18.     struct Person p4 = {.heigth=1.77.name="wangwu".age=33};  
  19.       

>結構體內存對齊

結構體的對齊規則: 
1.第一個成員與結構體變量偏移量爲0的地址處; 
2.其他成員變量要對齊到某個數字(對齊數)的整數倍地址處 。對齊數=編譯器默認的一個對齊數與該成員大小的較小值。VS中默認值爲8,Linux中默認值爲4
3.結構體總大小爲最大對其數的整數倍 
4.嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對其數(含嵌套結構體的對齊數)的整數倍。
結構體的內存對齊是拿空間換時間的做法。

>位段,位段計算機大小。

位段的聲明和結構是類似的 
1.位段成員必須是 int ,unsigned int 或signed int 
2.位段成員名後面有一個冒號和一個數字(表示佔幾個比特位)

>枚舉+聯合。 

枚舉:列舉,將可能的取值一一例舉。
[html] view plain copy
  1. enum Day{    //星期  
  2.   Mon,  
  3.   Tue,  
  4.   Wed,  
  5.   Thur,  
  6.   Fri,  
  7.   Sat,  
  8.   Sun  
  9. };  

enum Day是枚舉類型。{}中的內容是枚舉類型的可能取值(枚舉常量)。這些可能取值都是有值的,默認從0開始,一次增1,當然在定義的時候也可以賦初值,後邊一次增1。枚舉變量被賦值爲枚舉常量內的某一個,也可以是其他整數。
枚舉的優點: 
1.增加代碼的可讀性和可維護性
2.和#define 定義的標識符比較,枚舉有類型檢查,更加嚴謹
3.防止爲了命名污染 (封裝)
4.便於調試 
5.使用方便,一次可以定義多個常量

聯合(共用體)
共享內存

聯合類型的定義:聯合是一種特殊的自定義類型,這種類型定義的變量也包含一系列的成員,特徵是這些成員共用同一塊空間(所以聯合也稱爲共用體)
例如:
[html] view plain copy
  1. //聯合類型的聲明  
  2. union Un  
  3. {  
  4.    char c;  
  5.    int i;  
  6. };  
  7. //聯合變量的定義  
  8. union Un un;  
  9. //計算聯合變量的大小  
  10. printf("%d\n‘,sizeof(un));  

聯合的特點:
聯合的成員是共用一段內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小。
聯合體內的所有成員均以從第一個字節處開始使用 
聯合大小的計算:
1.聯合的大小至少是最大成員的大小
2.當最大成員的大小不是最大對齊數的整數倍的時候,就要對齊到最大對其數的整數倍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章