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