什么是“自定義資料型別”?顧名思義,就是用戶可以隨時在程式中自行定義新的資料型別,自定義資料型別時需要設定資料型別的名稱及其成員,資料型別成員各屬性的設定方法等同于變數設定時相應屬性的設定方法,

一、什么是聯合體?
在C語言中,變數的定義是分配存盤空間的程序,一般的,每個變數都具有其獨有的存盤空間,那么可不可以在同一個記憶體空間中存盤不同的資料型別(不是同時存盤)呢?
聯合體可以做到,聯合體也叫共用體,在C語言中定義聯合體的關鍵字是union,它是C語言中的一種特殊的資料型別,定義union下面的成員變數共享一塊記憶體,每一個成員在任一時刻有且只有一個成員使用此塊記憶體,共同體是會按照成員中最大的一個資料長度分配空間,它的本質就是同一塊記憶體的不同形式的訪問,
定義一個聯合型別的一般形式為:
union聯合名
{
成員表
};
union 的用途之一是將一種較長的基本型別與由其它比較小的資料型別組成的結構(structure)或陣列(array)聯合使用,例如:
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++感興趣,想要深入學習,這里有一個交流群推薦給你,
群內含有素材包,初學者入門學習資源,還有專案開發免費課程,更有牛人、大牛在線為你解答專業知識,為你在學習的道路上助力~
不論是小白還是進階者,在這里都能獲得成長,
點我加入

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/183077.html
標籤:其他
上一篇:大廠面試系列(一)::JVM基礎
