首先是struct,在C++中,結構體其實和class有很大的相似了。但是有一點不同的是,struct默認是public,而class中是private. 當然,struct繼承等用法也是可以的。 共用體的聲明方式是: 枚舉的聲明方式與共用體比較相似 其中a初始化為0,後面默認增1,若已經初始化,則後面再增1,比如d=6在這裡。 struct長度計算 大家猜一下,s1 x;int b=sizeof(x); 他的結果會是多少呢?有人會覺得應該是1+8+4+1=14. 實際上是24.為什麼會是這樣呢?這個和結構體的對齊方式有很大關系。總之有兩條 1、整體空間是最大成員占用字節的整數倍,比如這裡最大字節占用的是double,他為8,那肯定是8,16,24... 2、內存按照結構體中的數據成員先後排序,並且當前地址應該是以當前成員所占用空間的整數倍。比如在這裡double b占用的是8個字節,那麼以擺字節就應該是8,16,24.而char a,只有一個字節,則前面空間自動補齊。 按照上面兩點的規則,我們不難得出8+8+4+1,但是應該是8的整數倍,所以是24. 這裡有必要補充一下:在Linux+gcc環境下,若最大成員是4,則整體空間只需是4的倍數即可。所以這裡只需要是4的倍數,4,8,12,16,20,24.. 第二點,在Linux+gcc環境下,若某成員類型所占字節數超過4,那前面已擺放空間只需要是4的倍數即可。這裡double b;前面只需補齊4個即可,而不需補齊8個。 故會出現整體空間是20的情況。4+8+4+1=17.但是應該是4的倍數,則為20. 那麼聯合體應該是怎麼樣的呢? 很顯然聯合體取值的時候只能取其中的一個,那麼,聯合體就是多個成員公用一個內存空間。大家很自然的就想到了,最大那個成員所占用的空間就是聯合體的空間了。 講到了數據的對齊方式,那我們就非常有必要講一下兩種不同機器的存儲方式:大端存儲模式和小端存儲模式。 大端存儲模式:高位字節存儲低地位內存中,低位字節存儲高位。這裡均以0x12345678為例。 小端存儲模式:低位存儲在高位內存中 在小端系統中,b的ASCII為多少? 復制代碼 1 union enumName { 2 int i; 3 unsigned char ch[2]; 4 }; 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 enumName student; 8 student.i=0x1420; 9 char b=student.ch[0]; 10 } 復制代碼 答案應該是32 小端是低位放低位,高位放高位。則是20 14這樣排放。ch[0]等於0x20.