共用體是一種特殊的數據類型,容許您在相同的內存位置存儲不一樣的數據類型。您能夠定義一個帶有多成員的共用體,可是任什麼時候候只能有一個成員帶有值。共用體提供了一種使用相同的內存位置的有效方式。html
爲了定義共用體,您必須使用 union 語句,方式與定義結構相似。union 語句定義了一個新的數據類型,帶有多個成員。union 語句的格式以下:數據結構
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];spa
union tag 是可選的,每一個 member definition 是標準的變量定義,好比 int i; 或者 float f; 或者其餘有效的變量定義。在共用體定義的末尾,最後一個分號以前,您能夠指定一個或多個共用體變量,這是可選的。下面定義一個名爲 Data 的共用體類型,有三個成員 i、f 和 str:htm
union Data
{
int i;
float f;
char str[20];
} data;教程
Data 類型的變量能夠存儲一個整數、一個浮點數,或者一個字符串。這意味着一個變量(相同的內存位置)能夠存儲多個多種類型的數據。您能夠根據須要在一個共用體內使用任何內置的或者用戶自定義的數據類型。內存
共用體佔用的內存應足夠存儲共用體中最大的成員。例如,在上面的實例中,Data 將佔用 20 個字節的內存空間,由於在各個成員中,字符串所佔用的空間是最大的。下面的實例將顯示上面的共用體佔用的總內存大小:字符串
#include <stdio.h>
#include <string.h>
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
printf( "Memory size occupied by data : %d\n", sizeof(data));
return 0;
}get
結果:string
Memory size occupied by data : 20
爲了訪問共用體的成員,咱們使用成員訪問運算符(.)。成員訪問運算符是共用體變量名稱和咱們要訪問的共用體成員之間的一個句號。您可使用 union 關鍵字來定義共用體類型的變量。下面的實例演示了共用體的用法:it
#include <stdio.h>
#include <string.h>
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 : %d\n", data.i);
printf( "data.f : %f\n", data.f);
printf( "data.str : %s\n", data.str);
return 0;
}
結果:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
咱們能夠看到共用體的 i 和 f 成員的值有損壞,由於最後賦給變量的值佔用了內存位置,這也是 str 成員可以無缺輸出的緣由。如今讓咱們再來看一個相同的實例,此次咱們在同一時間只使用一個變量,這也演示了使用共用體的主要目的:
實例
#include <stdio.h>
#include <string.h>
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %f\n", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);
return 0;
}
結果:
data.i : 10 data.f : 220.500000 data.str : C Programming
在這裏,全部的成員都能無缺輸出,由於同一時間只用到一個成員
結構體變量所佔內存長度是其中最大字段大小的整數倍(參考:結構體大小的計算)。
共用體變量所佔的內存長度等於最長的成員變量的長度。例如,教程中定義的共用體Data各佔20個字節(由於char str[20]變量佔20個字節),而不是各佔4+4+20=28個字節。
union Data { int i; float f; char str[20]; } data;
節省內存,有兩個很長的數據結構,不會同時使用,好比一個表示老師,一個表示學生,若是要統計教師和學生的狀況用結構體的話就有點浪費了!用共用體的話,只佔用最長的那個數據結構所佔用的空間,就足夠了!
通訊中的數據包會用到共用體:由於不知道對方會發一個什麼包過來,用共用體的話就很簡單了,定義幾種格式的包,收到包以後就能夠直接根據包的格式取出數據。
union Data{ int i; float f; char str[9]; double d; }data;
共用體所佔內存並不是是9個char,即9個字節,而是double的兩倍,即16個字節,並且每次輸出都是它前面離它最近的值