C 語(yǔ)言中的 union
由于 C 語(yǔ)言是強(qiáng)類(lèi)型語(yǔ)言,不能如同某些語(yǔ)言一樣,可以在變量中存儲(chǔ)任意元素。所以在有的時(shí)候會(huì)遇到一些問(wèn)題。比如你有一個(gè)變量需要存儲(chǔ)計(jì)算結(jié)果,計(jì)算結(jié)果有時(shí)可能是整數(shù),有時(shí)可能是浮點(diǎn)數(shù)。這里我們介紹其中可以做到不更改變量名就可以存儲(chǔ)不同類(lèi)型數(shù)據(jù)的變量。
1. 聲明 union
和之前介紹的 struct
的聲明方式是類(lèi)似的,通過(guò)關(guān)鍵字 union
,以及這個(gè) union
的名稱(chēng),還有一系列的變量類(lèi)型以及名稱(chēng)。
union Calculation
{
int i;
float f;
char str[100];
};
union Calculation cal1, cal2;
看著結(jié)構(gòu)感覺(jué)是不是很熟悉。但是這和 struct
有著本質(zhì)的不同。之前的 struct
是一個(gè)集合,里面的變量之間是獨(dú)立的。而這個(gè) union
則正好相反,這不是一個(gè)集合,而只是一個(gè)特殊的變量,是一個(gè),不是多個(gè)。只不過(guò)這個(gè)變量可以在其聲明包含的這些變量類(lèi)型之間變化。一次只能有一個(gè)內(nèi)部的變量類(lèi)型被賦值,如果多次賦值,那么最后一次的賦值會(huì)覆蓋前面的變量?jī)?nèi)容。
2. 初始化 union
初始化一個(gè) union
和初始化一個(gè)變量是一致的,只能初始化里面其中一個(gè)值,一般默認(rèn)形式是初始化其中的第一個(gè)值。
union Calculation cal1 = 1;
3. 使用 union
使用一個(gè) union
變量需要使用成員訪(fǎng)問(wèn)符,也就是英文句號(hào) .
。
cal1.i = 1;
4. 示例程序
#include <stdio.h>
#include <string.h>
int main()
{
union Calculation {
int i;
float f;
char str[100];
};
union Calculation cal1 = {1};
printf("cal1.i: %d, cal1.f: %f, cal1.str: %s\n", cal1.i, cal1.f, cal1.str);
cal1.f = 0.111;
printf("cal1.i: %d, cal1.f: %f, cal1.str: %s\n", cal1.i, cal1.f, cal1.str);
strcpy(cal1.str, "None");
printf("cal1.i: %d, cal1.f: %f, cal1.str: %s\n", cal1.i, cal1.f, cal1.str);
return 0;
}
運(yùn)行結(jié)果:
cal1.i: 1, cal1.f: 0.000000, cal1.str:
cal1.i: 1038308344, cal1.f: 0.111000, cal1.str: S=
cal1.i: 1701736270, cal1.f: 70373527000468267466752.000000, cal1.str: None
在這個(gè)示例中我們展示了其用法??梢钥吹匠跏蓟臅r(shí)候只能給第一種類(lèi)型的變量賦值,后面的每次賦值都會(huì)覆蓋其他類(lèi)型的值。所以只有最后一次的賦值的類(lèi)型是可以使用的。這和之前介紹的 struct
是完全不同的。
5. 小結(jié)
到這里可能有些同學(xué)不解其中緣由,其實(shí)不復(fù)雜,主要是兩個(gè)在內(nèi)存的存儲(chǔ)分配上是不同的。之前的 struct
是給每一種類(lèi)型的變量都存儲(chǔ)的存儲(chǔ)空間,而 union
則只是按照類(lèi)型里需要內(nèi)存最多的類(lèi)型分配了一個(gè)內(nèi)存存儲(chǔ)位置。因?yàn)橹挥幸粋€(gè)存儲(chǔ)位置,所以就會(huì)出現(xiàn)后面的會(huì)覆蓋掉之前存儲(chǔ)的內(nèi)容的情況。