C語言union(聯合體、共用體)及應用


C語言union(聯合體、共用體)及應用  

在結構體(變量)中,結構的各成員順序排列存儲,每個成員都有自己獨立的存儲位置。聯合(union)變量的所有成員共享同片存儲區/內存。因此聯合變量每個時刻里只能保存它的某一個成員的值。

聯合變量也可以在定義時直接初始化,但這個初始化只能對第一個成員進行。例如下面的描述定義了一個聯合變量,並進行了初始化。

1 uunion data
2 {
3     char n;
4     float f;
5 };
6 union data u1 = {3}; //只有u1.n被初始化

union的主要特征有: 

union中可以定義多個成員,union的大小由最大的成員的大小決定;

union成員共享同一塊大小的內存,一次只能使用其中的一個成員; 
對union某一個成員賦值,會覆蓋其他成員的值(但前提是成員所占字節數相同,當成員所占字節數不同時只會覆蓋相應字節上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因為char只占一個字節,而int占四個字節);
union量的存放順序是所有成員都從低地址開始存放的

因此,可以用聯合(union)來判斷CPU的大小端(印第安序):

 1 int checkCPU()
 2 {
 3     union w
 4     {
 5         int a;
 6         char b;
 7     }c;
 8     
 9     c.a = 1;
10     
11     return ( c.b == 1 );
12 }

同樣的道理,在Linux中給出了更加精練的實現。如果宏ENDIANNESS='l'表示系統為little endian, 為‘b’表示big endian。

1 static union
2 {
3     char c[4];
4     unsigned long l;
5 }endian_test = { {'l','?','?','b'} };
6 
7 #define ENDIANNESS ( (char)endian_test.l )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM