union是一種數據類型,跟struct類型有點類似,其形式為:
union 聯合名 {
type1name1;
type2name2;
……
} 聯合變量名;
聯合表示幾個變量共用一個內存位置,在不同的時間保存不同的數據類型和不同的數據長度。當一個聯合被說明時,編譯程序自動的產生一個變量,其長度為聯合中最大的變量長度。聯合成員的訪問方法跟結構的一樣。
struct和union和區別:
1.結構和聯合都是由多個不同的數據類型成員組成的,但是在任一時刻聯合只存放一個被選中的成員,而結構的所有成員都存在。
2。對於聯合的不同成員賦值,將會對其他成員重寫,原來成員的值就不存在了,而對結構的不同成員賦值是會不影響的。
對聯合變量的賦值,都只能對變量的成員進行,一個聯合變量每次只能賦值給一個成員,一個聯合變量的值就是當前聯合變量的某一個成員值。
應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。
http://www.linuxidc.com/Linux/2013-11/93188.htm
這裡用的是union來控制這個共享布局,有個知識點就是union裡面的成員c和i都是從低地址開始對齊的。
http://www.linuxidc.com/Linux/2013-11/93189.htm
關於匿名聯合:
匿名聯合的成員名不能與同一個作用於內的其它變量名沖突。
由於匿名聯合不使用點運算符,所以包含在匿名聯合內的元素必須是數據,不允許有成員函數,
也不能包含私有或受保護的成員,還有全局匿名聯合必須是靜態的,否則就必須放在匿名名字空間裡。
聯合裡面的成員共享內存,所以靜態、引用(由於不能共享內存)都不能用。
聯合裡面不允許存放帶有構造函數、析構函數、復制拷貝操作符等類,因為他們共享內存,編譯器無法保證這些對象不被破壞,也無法保證離開時能調用析構函數。
感覺還是沒太明白!