鍍金池/ 教程/ C/ C 共用體
C 輸入 & 輸出
C 標準庫 - < signal.h >
C 標準庫- < string.h >
C 循環(huán)
C 數(shù)據(jù)類型
C 字符串
C 標準庫 - < stdarg.h >
C 標準庫 - < math.h >
C 預處理器
C 存儲類
C 標準庫 - < locale.h >
C 指針
C 標準庫 - < assert.h >
C 結(jié)構(gòu)體
C 命令行參數(shù)
C 標準庫 - < ctype.h >
C 強制類型轉(zhuǎn)換
C 程序結(jié)構(gòu)
C typedef
C 遞歸
C 運算符
C 環(huán)境設(shè)置
C 函數(shù)
C 位域
C 標準庫 - < stddef.h >
C 數(shù)組
C 標準庫 - < errno.h >
C 標準庫 -參考手冊
C 可變參數(shù)
C 變量
C 錯誤處理
C 作用域規(guī)則
C 文件讀寫
C 內(nèi)存管理
C 基本語法
C 標準庫 - < stdio.h >
C 標準庫 - < time.h >
C 頭文件
C 判斷
C 標準庫 - < limits.h >
C 共用體
C 標準庫 - < setjmp.h >
C 常量
C 標準庫 - < float.h >
C 簡介
C 標準庫 - < stdlib.h >

C 共用體

共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。

定義共用體

為了定義結(jié)構(gòu)體,您必須使用 union 語句,方式與定義結(jié)構(gòu)類似。union 語句定義了一個新的數(shù)據(jù)類型,帶有多個成員。union 語句的格式如下:

    union [union tag]
    {
       member definition;
       member definition;
       ...
       member definition;
    } [one or more union variables];

union tag 是可選的,每個 member definition 是標準的變量定義,比如 int i; 或者 float f; 或者其他有效的變量定義。在共用體定義的末尾,最后一個分號之前,您可以指定一個或多個共用體變量,這是可選的。下面定義一個名為 Data 的共用體類型,有三個成員 i、f 和 str:

    union Data
    {
       int i;
       float f;
       char  str[20];
    } data;

現(xiàn)在,Data 類型的變量可以存儲一個整數(shù)、一個浮點數(shù),或者一個字符串。這意味著一個變量(相同的內(nèi)存位置)可以存儲多個多種類型的數(shù)據(jù)。您可以根據(jù)需要在一個共用體內(nèi)使用任何內(nèi)置的或者用戶自定義的數(shù)據(jù)類型。

共用體占用的內(nèi)存應足夠存儲共用體中最大的成員。例如,在上面的實例中,Data 將占用 20 個字節(jié)的內(nèi)存空間,因為在各個成員中,字符串所占用的空間是最大的。下面的實例將顯示上面的共用體占用的總內(nèi)存大?。?/p>

    #include 
    #include 

    union Data
    {
       int i;
       float f;
       char  str[20];
    };

    int main( )
    {
       union Data data;

       printf( "Memory size occupied by data : %dn", sizeof(data));

       return 0;
    }

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:

    Memory size occupied by data : 20

訪問共用體成員

為了訪問共用體的成員,我們使用成員訪問運算符(.)。成員訪問運算符是共用體變量名稱和我們要訪問的共用體成員之間的一個句號。您可以使用 union 關(guān)鍵字來定義共用體類型的變量。下面的實例演示了共用體的用法:

    #include 
    #include 

    union Data
    {
       int i;
       float f;
       char  str[20];
    };

    int main( )
    {
       union Data data;

       data.i = 10;
       data.f = 220.5;
       strcpy( data.str, "C Programming");

       printf( "data.i : %dn", data.i);
       printf( "data.f : %fn", data.f);
       printf( "data.str : %sn", data.str);

       return 0;
    }

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:

    data.i : 1917853763
    data.f : 4122360580327794860452759994368.000000
    data.str : C Programming

在這里,我們可以看到共用體的 if 成員的值有損壞,因為最后賦給變量的值占用了內(nèi)存位置,這也是 str 成員能夠完好輸出的原因?,F(xiàn)在讓我們再來看一個相同的實例,這次我們在同一時間只使用一個變量,這也演示了使用共用體的主要目的:

    #include 
    #include 

    union Data
    {
       int i;
       float f;
       char  str[20];
    };

    int main( )
    {
       union Data data;

       data.i = 10;
       printf( "data.i : %dn", data.i);

       data.f = 220.5;
       printf( "data.f : %fn", data.f);

       strcpy( data.str, "C Programming");
       printf( "data.str : %sn", data.str);

       return 0;
    }

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:

    data.i : 10
    data.f : 220.500000
    data.str : C Programming

在這里,所有的成員都能完好輸出,因為同一時間只用到一個成員。