聯合 union 用法

2021-05-22 15:57:21 字數 1583 閱讀 1869

聯合(union)在c裡面見得並不多,但是在一些對記憶體要求特別嚴格的地方,聯合又是頻繁出現,那麼究竟什麼是聯合?怎麼去用?有什麼需要注意的地方呢?

(1)什麼是聯合?一種構造型別的資料結構。在乙個「聯合」內可以定義多種不同的資料型別, 乙個被說明為該「聯合」型別的變數中,允許裝入該「聯合」所定義的任何一種資料,這些資料共享同一段記憶體,已達到節省空間的目的。這是乙個特殊的地方,也是聯合的特徵。

(2)聯合與結構的區別?「聯合」與「結構」有一些相似之處,但兩者有本質上的不同。在結構中各成員有各自的記憶體空間, 乙個結構變數的總長度是各成員長度之和(空結構除外,同時不考慮邊界調整)。而在「聯合」中,各成員共享一段記憶體空間, 乙個聯合變數的長度等於各成員中最長的長度。應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入乙個聯合變數內, 而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。下面舉乙個例了來加對深聯合的理解。

int _tmain(int argc, _tchar* argv)

half;

}num;

num.i=0x4241;

printf("%c %c /n",num.half.first,num.half.second);

num.half.first='a';

num.half.second='b';

printf("%x /n",num.i);

getchar();

}輸出結果為:      ab      6261 

(3)如何說明?聯合變數的說明有三種形式:先定義再說明、定義同時說明和直接說明。以test型別為例,說明如下:

1) union test

; union test a,b;    /*說明a,b為test型別*/

2) union test

a,b;

3) union

a,b; 

經說明後的a,b變數均為test型別。a,b變數的長度應等於test的成員中最長的長度,即等於teacher陣列的長度,共5個位元組。a,b變數如賦予整型值時,只使用了4個位元組,而賦予字元陣列時,可用5個位元組。

(4)需要討論的地方。聯合裡面那些東西不能存放?我們知道,聯合裡面的東西共享記憶體,所以靜態、引用都不能用,因為他們不可能共享記憶體。

(5)關於聯合型別的子資料沒有具體大小的現象。

typedef union day_register

;} dayregister;

dayregister  dayreg;

typedef struct _systemtime systemtime, *lpsystemtime;

lpsystemtime ptime;

結果,以下的賦值操作是有效的:

dayreg.dayofweek    = ptime->wdayofweek + 1;   

dayreg.hours        = ptime->whour;

dayreg.minutes      = ptime->wminute;

dayreg.seconds      = ptime->wsecond;

參考原文:http://visionsky.blog.51cto.com/733317/151760

聯合 union 用法

聯合 union 在c c 裡面見得並不多,但是在一些對記憶體要求特別嚴格的地方,聯合又是頻繁出現,那麼究竟什麼是聯合 怎麼去用 有什麼需要注意的地方呢?就這些問題,我試著做一些簡單的回答,裡面肯定還有不當的地方,歡迎指出!1 什麼是聯合?聯合 是一種特殊的類,也是一種構造型別的資料結構。在乙個 聯...

聯合 union 用法

聯合 union 在c裡面見得並不多,但是在一些對記憶體要求特別嚴格的地方,聯合又是頻繁出現,那麼究竟什麼是聯合?怎麼去用?有什麼需要注意的地方呢?1 什麼是聯合?一種構造型別的資料結構。在乙個 聯合 內可以定義多種不同的資料型別,乙個被說明為該 聯合 型別的變數中,允許裝入該 聯合 所定義的任何一...

聯合 union 用法

聯合 union 在c c 裡面見得並不多,但是在一些對記憶體要求特別嚴格的地方,聯合又是頻繁出現,那麼究竟什麼是聯合 怎麼去用 有什麼需要注意的地方呢?就這些問題,我試著做一些簡單的回答,裡面肯定還有不當的地方,歡迎指出!1 什麼是聯合?聯合 是一種特殊的類,也是一種構造型別的資料結構。在乙個 聯...