您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)C語言關(guān)鍵字union怎么用,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
union,中文名“聯(lián)合體、共用體”,在某種程度上類似結(jié)構(gòu)體struct的一種數(shù)據(jù)結(jié)構(gòu),共用體(union)和結(jié)構(gòu)體(struct)同樣可以包含很多種數(shù)據(jù)類型和變量。
但在“聯(lián)合”中, 各成員共享一段內(nèi)存空間, 一個(gè)聯(lián)合變量的長(zhǎng)度等于各成員中最長(zhǎng)的長(zhǎng)度 。一個(gè)聯(lián)合體類型必須經(jīng)過定義之后, 才能使用它,才能把一個(gè)變量聲明定義為該聯(lián)合體類型。
當(dāng)定義結(jié)構(gòu)對(duì)象時(shí),如果沒有顯式地初始化它們,則會(huì)采用一般初始化規(guī)則:如果該結(jié)構(gòu)對(duì)象屬于動(dòng)態(tài)存儲(chǔ)類型,那么其成員具有不確定的初始值。
另一方面,如果結(jié)構(gòu)對(duì)象具有靜態(tài)存儲(chǔ)周期,那么其非指針成員初始值是 0,其指針成員初始值是空指針。
不同于結(jié)構(gòu)成員——它們?cè)诮Y(jié)構(gòu)中都具有單獨(dú)的內(nèi)存位置,聯(lián)合成員則共享同一個(gè)內(nèi)存位置。也就是說,聯(lián)合中的所有成員都是從相同的內(nèi)存地址開始。因此,可以定義一個(gè)擁有許多成員的聯(lián)合,但是同一時(shí)刻只能有一個(gè)成員允許含有一個(gè)值。聯(lián)合讓程序員可以方便地通過不同方式使用同一個(gè)內(nèi)存位置。
聯(lián)合的定義方式與結(jié)構(gòu)是一樣的,只是把關(guān)鍵字 struct 改成 union:
union [標(biāo)簽名稱]{成員聲明列表};
下面的例子定義了一個(gè)名為Data的聯(lián)合類型,它有 3 個(gè)成員:i、x 和 str:
union Data { int i;double x;char str [16];};
這種類型的對(duì)象可以存儲(chǔ)一個(gè)整數(shù)、一個(gè)浮點(diǎn)數(shù)或一個(gè)短字符串。
例如:
union StateMachine { char character; int number; char *str; double exp; };
一個(gè)union 只配置一個(gè)足夠大的空間以來容納最大長(zhǎng)度的數(shù)據(jù)成員,以上例而言,最大長(zhǎng)度是double 型態(tài),所以StateMachine 的空間大小就是double 數(shù)據(jù)類型的大小。
在C++里,union 的成員默認(rèn)屬性頁(yè)為public。union 主要用來壓縮空間。如果一些數(shù)據(jù)不可能在同一時(shí)間同時(shí)被用到,則可以使用union。
與結(jié)構(gòu)類似,通過初始化列表(initialization list)來初始化聯(lián)合對(duì)象。但是,對(duì)聯(lián)合來說,列表只有一個(gè)初始化器(initializer)。
與結(jié)構(gòu)一樣,C99 允許在初始化器中使用成員指示符來指示哪個(gè)成員被初始化。而且,如果初始化器沒有成員指示符,那么就與聯(lián)合內(nèi)的第一個(gè)成員關(guān)聯(lián)。具有自動(dòng)存儲(chǔ)類的聯(lián)合對(duì)象也可以使用已有的同類型對(duì)象來初始化。下面是一些初始化例子:
union Data var1={77}, var2={.str="Mary"}, var3=var1, myData[100]={{.x=0.5},{1},var2};
數(shù)組 myData 中的元素如果沒有指定初始化器,會(huì)被隱式地初始化為 0 值。
聯(lián)合變量的說明和結(jié)構(gòu)變量的聲明方式相同, 也有三種形式:
第一種 , 先定義聯(lián)合體類型,再聲明聯(lián)合體變量 ;
第二種 ,定義聯(lián)合體類型的同時(shí)聲明聯(lián)合體變量;
第三種 ,直接聲明聯(lián)合體(以匿名的形式定義聯(lián)合體類型)。
以perdata類型為例,說明如下:
第一種, 先定義聯(lián)合體類型,再聲明聯(lián)合體變量
union perdata { int class; char officae[10]; }; union perdata a,b; /*說明a,b為perdata類型*/
第二種, 定義聯(lián)合體類型的同時(shí)聲明聯(lián)合體變量:
union perdata { int class; char office[10]; } a , b ;
第三種, 直接聲明聯(lián)合體(以匿名的形式定義聯(lián)合體類型):
union { int class; char office[10]; }a,b
經(jīng)說明后的a,b變量均為perdata類型。a,b變量的長(zhǎng)度應(yīng)等于 perdata 的成員中最長(zhǎng)的長(zhǎng)度, 即等于office數(shù)組的長(zhǎng)度,共10個(gè)字節(jié)。對(duì)a,b變量如賦予整型值時(shí),只使用了2個(gè)字節(jié),而賦予字符數(shù)組時(shí),可用10個(gè)字節(jié)。
對(duì)聯(lián)合體變量的賦值,使用都只能是對(duì)變量的成員進(jìn)行。
聯(lián)合變量的成員表示為: 聯(lián)合變量名 . 成員名
例如,a被說明為perdata類型的變量之后,可使用 a.class,a.office
不允許只用聯(lián)合變量名作賦值或其它操作。 也不允許對(duì)聯(lián)合變量作初始化賦值,賦值只能在程序中進(jìn)行。
一個(gè)聯(lián)合體變量, 每次只能賦予一個(gè)成員值。一個(gè)聯(lián)合變量的值就是聯(lián)合變員的某一個(gè)成員值。
1.結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類型成員組成的,但是在任一時(shí)刻聯(lián)合只存放一個(gè)被選中的成員,而結(jié)構(gòu)的所有成員都存在。
2。對(duì)于聯(lián)合的不同成員賦值,將會(huì)對(duì)其他成員重寫,原來成員的值就不存在了,而對(duì)結(jié)構(gòu)的不同成員賦值是會(huì)不影響的。
對(duì)聯(lián)合變量的賦值,都只能對(duì)變量的成員進(jìn)行,一個(gè)聯(lián)合變量每次只能賦值給一個(gè)成員,一個(gè)聯(lián)合變量的值就是當(dāng)前聯(lián)合變量的某一個(gè)成員值。
應(yīng)該說明的是, 這里所謂的共享不是指把多個(gè)成員同時(shí)裝入一個(gè)聯(lián)合變量?jī)?nèi), 而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。
關(guān)于“C語言關(guān)鍵字union怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。