在本教程中,您將學(xué)習(xí)C語言編程中的共用體。更具體地說,如何創(chuàng)建共用體(聯(lián)合體),訪問其成員以及了解共用體與組織之間的差異。共用體又被稱為聯(lián)合體, 和結(jié)構(gòu)體同屬于C語言數(shù)據(jù)類型中的結(jié)構(gòu)類型。
共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型。您可以定義一個(gè)帶有多成員的共用體,但是任何時(shí)候只能有一個(gè)成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。
union也是一種用戶定義的類型,類似于C中的struct,除了一個(gè)關(guān)鍵字的區(qū)別。結(jié)構(gòu)體分配足夠的空間存儲其所有成員,而共用體分配空間僅存儲最大的成員。
我們使用union關(guān)鍵字定義共用體。這是一個(gè)實(shí)例:
union car
{
char name[50];
int price;
};上面的代碼定義了派生類型union car。
定義共用體后,它將創(chuàng)建用戶定義的類型。但是,沒有分配內(nèi)存。要為給定的聯(lián)合類型分配內(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;在這兩種情況下,都會創(chuàng)建union car類型的union變量car1、car2和union指針car3。
我們使用.運(yùn)算符來訪問共用體的成員。要訪問指針變量,我們還使用->運(yùn)算符。
在上面的示例中,
要訪問car1的價(jià)格(price),請使用car1.price。
要訪問car3的價(jià)格(price),可以使用(* car3).price或car3-> price。
讓我們以一個(gè)實(shí)例來說明共用體與結(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