什麼是「自定義數據類型」?顧名思義,就是用戶能夠隨時在程序中自行定義新的數據類型。自定義數據類型時須要設置數據類型的名稱及其成員。數據類型成員各屬性的設置方法等同於變量設置時相應屬性的設置方法。數組
1、什麼是聯合體?學習
在C語言中,變量的定義是分配存儲空間的過程。通常的,每一個變量都具備其獨有的存儲空間,那麼可不能夠在同一個內存空間中存儲不一樣的數據類型(不是同時存儲)呢?spa
聯合體能夠作到。聯合體也叫共用體,在C語言中定義聯合體的關鍵字是union,它是C語言中的一種特殊的數據類型。定義union下面的成員變量共享一塊內存,每個成員在任一時刻有且只有一個成員使用此塊內存。共同體是會按照成員中最大的一個數據長度分配空間,它的本質就是同一塊內存的不一樣形式的訪問。3d
定義一個聯合類型的通常形式爲:對象
union聯合名blog
{內存
成員表資源
};開發
union 的用途之一是將一種較長的基本類型與由其它比較小的數據類型組成的結構(structure)或數組(array)聯合使用,例如:get
union mix_t{
long l;
struct {
short hi;
short lo;
} s;
char c[4];
} mix;
以上例子中定義了3個名稱:mix.l, mix.s 和 mix.c,咱們能夠經過這3個名字來訪問同一段4 bytes長的內存空間。至於使用哪個名字來訪問,取決於咱們想使用什麼數據類型,是long, short 仍是 char 。下圖顯示了在這個聯合(union)中各個元素在內存中的的可能結構,以及咱們如何經過不一樣的數據類型進行訪問:
匿名聯合(Anonymous union)
在 C++ 咱們能夠選擇使聯合(union)匿名。若是咱們將一個union包括在一個結構(structure)的定義中,而且不賦予它object名稱 (就是跟在花括號{}後面的名字),這個union就是匿名的。這種狀況下咱們能夠直接使用union中元素的名字來訪問該元素,而不須要再在前面加 union對象的名稱。在下面的例子中,咱們能夠看到這兩種表達方式在使用上的區別:
以上兩種定義的惟一區別在於左邊的定義中咱們給了union一個名字price,而在右邊的定義中咱們沒給。在使用時的區別是當咱們想訪問一個對象(object)的元素dollars 和yens 時,在前一種定義的狀況下,須要使用:
book.price.dollars
book.price.yens
而在後面一種定義下,咱們直接使用:
book.dollars
book.yens
再一次提醒,由於這是一個聯合(union),域dollars 和yens 佔據的是同一塊內存空間,因此它們不能被用來存儲兩個不一樣的值。也就是你能夠使用一個dollars 或yens的價格,但不能同時使用二者。
看完你會發現,聯合體和結構體有類似之處,也有不一樣之處。
結構體和聯合體的區別在於:結構體的各個成員會佔用不一樣的內存,互相之間沒有影響;而聯合體的全部成員佔用同一段內存,修改一個成員會影響其他全部成員。
結構體佔用的內存大於等於全部成員佔用的內存的總和(成員之間可能會存在縫隙),聯合體佔用的內存等於最長的成員佔用的內存。聯合體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,若是對新的成員賦值,就會把原來成員的值覆蓋掉。
若是你對C/C++感興趣,想要深刻學習,這裏有一個交流羣推薦給你。
羣內含有素材包,初學者入門學習資源,還有項目開發免費課程。更有牛人、大牛在線爲你解答專業知識,爲你在學習的道路上助力~
不管是小白仍是進階者,在這裏都能得到成長。