1、陣列:陣列是相同型別的元素的集合,它的每個元素是通過下標引用或者指標間接訪問來選擇的。
2、結構體:結構體也是一些值的集合,這些值稱為它的成員,但是乙個結構體的各個成員可能具有不同的型別。
3、陣列元素可以通過下標訪問,這是因為陣列的長度相同。在結構體中由於結構體的成員可能是不同的型別、長度不同。所以我們不能使用下標來訪問,但是每個結構體的成員都有自己的名字,他們是通過名字訪問的。
在宣告結構體的,必須列出它包含是所有成員。這個列表包括每個成員的型別和名字。
語法為:
struct tag
//結構體標籤
variable
-list;//變數列表
例如:
struct
x;
這個宣告建立了乙個名叫x的變數,它包含三個成員:乙個整數、乙個字元、和乙個浮點數。
struct
y[20], *z;
這個宣告建立了y和z。y是乙個陣列,它包含了20個結構。z是乙個指標,它指向這個型別的結構。
結構體標籤:允許為成員列表提供乙個名字,可以在後續的宣告中使用。標籤允許多個宣告使用同乙個成員列表,並且建立同一種型別的結構。
例如:
struct ******
;
這個宣告把******標籤和這個成員的列表聯絡一起。這個宣告並沒有提供變數的列表。所以它並未建立任何變數。標籤標識了一種模式,用於宣告未來的變數,但無論是標籤還是模式本身都不是變數。
struct ****** x;
struct ****** y[20],*z;
這些宣告使用標籤來建立變數,現在x,y和z都是同一種型別的結構變數。
宣告結構體的時候還有一種良好的技巧是使用typedef建立一種新的型別,如下面的例子:
typedef
struct
******;
這個技巧和宣告乙個結構標籤的效果幾乎相同。
1、結構的初始化方式和陣列的初始化很相似。乙個位於一對花括號內部、由逗號分隔的初始值列表可用於結構各個成員的初始化。這些值根據結構成員列表的順序寫出。如果初始列表的值不夠,剩餘的結構成員將使用預設值進行初始化。
2、如果結構體 中包含了陣列或者結構成員,其初始化方式和多維陣列初始化方式一樣。
例如:
struct point
p1;//宣告型別的同時定義變數p1
struct point p2;定義結構體變數p2
//初始化:定義變數的同時賦初值
struct point p3 = ;
struct stu //型別宣告
;struct stu s = ;//初始化
struct node
n1 = ,null};//結構體巢狀初始化
struct node n2 = ,null};
首先得掌握結構體的對齊規則:
1、第乙個成員在與結構體變數偏移量為0的位址處。
2、其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。vs中預設的值是8 linux中的預設值為4。
3、結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。
4、如果有巢狀結構體的情況,巢狀的結構體對齊自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
位段的宣告和結構是類似的,但是有兩個不同。
(1):位段的成員必須是 int、unsigned int或者signed int。
(2):位段的成員名後邊有乙個冒號和乙個整數,這個整數指定該位段所占用的位的數目。
struct a
printf("%d\n",sizeof(struct(a))
這就是乙個位段型別。
它列印出來的數字為8。為什麼會是8呢?你會不會說不對呀 明明是4個int應該是16呀。別著急我們分析分析
分析:在32位系統下乙個int型為4個位元組,也就是說有32個位元位。a占用2個,b占用5個,c占用10個。這三個一共加起來為17,因為d占用了30位所以很明顯乙個int是存放不下的,所以開闢了第二個int單獨放d。所以最終列印出8。
總結:位段跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在。
列舉顧名思義就是一 一枚舉。
列舉常量的取值預設是從0開始的。一次遞增1,當然在定義的時候也可以賦初值。
舉個例子:
enum color// 顏⾊色
;
列舉的優點:
1 、增加**的可讀性和可維護性。
2、很#define定義的識別符號⽐比較列舉有型別檢查,更更加嚴謹。
3 、防⽌止了了命名汙染(封裝)。
4 、便便於除錯。
5、 使用⽅便,一次可以定義多個常量量。
聯合也是⼀一種特殊的⾃自定義型別
這種型別定義的變數量也包含⼀一系列列的成員,特徵是這些成員公⽤用同⼀一塊空間(所以聯合也叫共⽤用
體)。
(1)聯合的特點:
聯合的成員是共⽤用同⼀一塊記憶體空間的,這樣⼀乙個聯合變數量的⼤大⼩小,⾄至少是最⼤大成員的⼤大⼩小
(因為聯合⾄至少得有能⼒力力儲存最⼤大的那個成員)。
例如:
union un
;union un un;
// 下⾯面輸出的結果是⼀一樣的嗎?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//結果是一樣的。
// 下⾯面輸出的結果是什什麼?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
如果你的電腦是小端的話 那麼輸出的結果是0x11223355。
聯合大小的計算
(1.)聯合的大小至少是最大成員的大小。
(2.)當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
自定義型別 結構體 位段 列舉 聯合
include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...
自定義型別 結構體 位段 列舉 聯合
1 結構體基礎知識 定義 不同或相同型別元素的集合 宣告 直接上例子會更清楚 成員 可以是變數 陣列 指標甚至其它結構體成員。struct stu 分號不能丟特殊宣告 匿名結構體型別,並不建議省略結構體型別名,知道有這麼回事就好了 struct x 注意 有n個結構體就有n種型別,即使兩個結構體成員...
自定義型別 結構體,位段,列舉,聯
1 結構體 1 結構體的宣告 結構體中的每個成員可以是不同型別的變數 例如 描述乙個學生 struct stu 2 結構體的自引用 struct node 3 結構體變數的定義和初始化 宣告型別的同時定義變數p1 struct point p1 初始化 struct point p2 4 結構體內存...