C共用體
共用體是一種特殊的數據類型,允許您在相同的內存位置存儲不同的數據類型。
定義共用體
定義共用體必須使用union關鍵字,方式與定義結構體類似。
rule:
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
union tag 是可選的
union Data
{
int i;
float f;
char str[20];
} data;
現在,Data 類型的變量可以存儲一個整數、一個浮點數,或者一個字符串。這意味着一個變量(相同的內存位置)可以存儲多個多種類型的數據。
共用體佔用的內存應足夠存儲共用體中最大的成員。
#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;
}
輸出結果:Memory size occupied by data : 20
訪問共用體成員
我們使用成員訪問運算符(.)來訪問共用體成員。
#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成員的值輸出錯誤,這是因爲最後賦給變量的值佔用了內存位置。
#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
現在所有的成員都能完好輸出,因爲同一時間只用到一個成員。
注意
結構體與共用體
結構體變量所佔內存長度是各成員佔的內存長度之和。每個成員分別佔有其自己的內存單元。共用體變量所佔的內存長度等於最長的成員變量的長度。
共用體作用
節省內存,有兩個很長的數據結構,不會同時使用。用共用體的話,只佔用最長的那個數據結構所佔用的空間。