在本教程中,您將學(xué)習(xí)C語(yǔ)言編程中的共用體。更具體地說(shuō),如何創(chuàng)建共用體(聯(lián)合體),訪問(wèn)其成員以及了解共用體與組織之間的差異。共用體又被稱(chēng)為聯(lián)合體, 和結(jié)構(gòu)體同屬于C語(yǔ)言數(shù)據(jù)類(lèi)型中的結(jié)構(gòu)類(lèi)型。
共用體是一種特殊的數(shù)據(jù)類(lèi)型,允許您在相同的內(nèi)存位置存儲(chǔ)不同的數(shù)據(jù)類(lèi)型。您可以定義一個(gè)帶有多成員的共用體,但是任何時(shí)候只能有一個(gè)成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。
union也是一種用戶(hù)定義的類(lèi)型,類(lèi)似于C中的struct,除了一個(gè)關(guān)鍵字的區(qū)別。結(jié)構(gòu)體分配足夠的空間存儲(chǔ)其所有成員,而共用體分配空間僅存儲(chǔ)最大的成員。
我們使用union關(guān)鍵字定義共用體。這是一個(gè)實(shí)例:
union car { char name[50]; int price; };
上面的代碼定義了派生類(lèi)型union car。
定義共用體后,它將創(chuàng)建用戶(hù)定義的類(lèi)型。但是,沒(méi)有分配內(nèi)存。要為給定的聯(lián)合類(lèi)型分配內(nèi)存并使用它,我們需要?jiǎng)?chuàng)建變量。
這是我們創(chuàng)建聯(lián)合變量的方法。
union car { char name[50]; int price; }; int main() { union car car1, car2, *car3; return 0; }
創(chuàng)建聯(lián)合變量的另一種方法是:
union car { char name[50]; int price; } car1, car2, *car3;
在這兩種情況下,都會(huì)創(chuàng)建union car類(lèi)型的union變量car1、car2和union指針car3。
我們使用.運(yùn)算符來(lái)訪問(wèn)共用體的成員。要訪問(wèn)指針變量,我們還使用->運(yùn)算符。
在上面的示例中,
要訪問(wèn)car1的價(jià)格(price),請(qǐng)使用car1.price。
要訪問(wèn)car3的價(jià)格(price),可以使用(* car3).price或car3-> price。
讓我們以一個(gè)實(shí)例來(lái)說(shuō)明共用體與結(jié)構(gòu)體之間的區(qū)別:
#include <stdio.h> union unionJob { //定義 union char name[32]; float salary; int workerNo; } uJob; struct structJob { char name[32]; float salary; int workerNo; } sJob; int main() { printf("union 的大小 = %d 字節(jié)", sizeof(uJob)); printf("\nstruct 的大小 = %d 字節(jié)", sizeof(sJob)); return 0; }
輸出結(jié)果
union 的大小 = 32 字節(jié) structure 的大小 = 40 字節(jié)
為什么聯(lián)合變量和結(jié)構(gòu)變量的大小存在這種差異?
在這里,sJob大小為40個(gè)字節(jié),因?yàn)?/p>
name[32]的大小是32個(gè)字節(jié)
salary的大小是4個(gè)字節(jié)
workerNo的大小是4個(gè)字節(jié)
但是,uJob大小為32個(gè)字節(jié)。這是因?yàn)槁?lián)合變量的大小將始終是其最大元素的大小。在上面的示例中,其最大元素(name[32])的大小為32個(gè)字節(jié)。
使用共用體,所有成員共享相同的記憶。
#include <stdio.h> union Job { float salary; int workerNo; } j; int main() { j.salary = 12.3; //當(dāng)j.workerNo被賦值時(shí), // j.salary將不再保留12.3 j.workerNo = 100; printf("薪水 = %.1f\n", j.salary); printf("工人人數(shù) = %d", j.workerNo); return 0; }
輸出結(jié)果
薪水 = 0.0 工人人數(shù) = 100