亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

C 語言中的 union

由于 C 語言是強類型語言,不能如同某些語言一樣,可以在變量中存儲任意元素。所以在有的時候會遇到一些問題。比如你有一個變量需要存儲計算結果,計算結果有時可能是整數,有時可能是浮點數。這里我們介紹其中可以做到不更改變量名就可以存儲不同類型數據的變量。

1. 聲明 union

和之前介紹的 struct 的聲明方式是類似的,通過關鍵字 union ,以及這個 union 的名稱,還有一系列的變量類型以及名稱。

union Calculation
{
    int i;
    float f;
    char str[100];
};

union Calculation cal1, cal2;

看著結構感覺是不是很熟悉。但是這和 struct 有著本質的不同。之前的 struct 是一個集合,里面的變量之間是獨立的。而這個 union 則正好相反,這不是一個集合,而只是一個特殊的變量,是一個,不是多個。只不過這個變量可以在其聲明包含的這些變量類型之間變化。一次只能有一個內部的變量類型被賦值,如果多次賦值,那么最后一次的賦值會覆蓋前面的變量內容。

2. 初始化 union

初始化一個 union 和初始化一個變量是一致的,只能初始化里面其中一個值,一般默認形式是初始化其中的第一個值。

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;
}

運行結果:

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. 小結

到這里可能有些同學不解其中緣由,其實不復雜,主要是兩個在內存的存儲分配上是不同的。之前的 struct 是給每一種類型的變量都存儲的存儲空間,而 union 則只是按照類型里需要內存最多的類型分配了一個內存存儲位置。因為只有一個存儲位置,所以就會出現后面的會覆蓋掉之前存儲的內容的情況。