C語言中Union類型的使用方法


轉自:http://blog.csdn.net/feimor/article/details/6858103

使用C語言時,常常使用struct,對於union類型卻幾乎沒有用過,只知道它是聯合類型,各字段共享一塊內存,實際應用中卻不知道它的具體用途。

今天讀《編程卓越之道》中看到有對其使用的簡單介紹,記錄在此:

首先摘錄一下struct和union的重要區別:

    struct為每個字段在不同的偏移處分配存儲空間,而聯合則將所有的字段重疊在內存中的相同偏移處。

聯合類型的用途:

             1、創建別名。別名是內存對象原名之外的其他名字。比如在程序中經常會用到將一個數據類型強制轉換為另一個類型,這個操作可以使用聯合來代替。

比如typedef union{

char c;

uint32 u;

}CharOfUnion v;

可以通過v.u來操作一個uint32類型的對象,當需要將uint32變量的低端字節看做一個字符的時候,只需要訪問v.c就可以了。

實際應用中,大多數的協議結構定義中,都會使用union類型來定義。

 

2、使用聯合來將較大的對象分解成組成這個對象的各個字節。(尤其在單片機編程中將float拆解成char

typedef union{

uint u;

char bytes[4];

}asBytes composite;

可以使用composite.bytes數組來訪問composite.u字段的各個字節。

轉自:http://blog.163.com/yx_xie2007/blog/static/1024642532011101411940162/

一直以來,union都是個很少用到的東西,對於這些不常用的結構往往記不住。這次看書又看到了,還是學習一下吧。
一般在Windows API的一些數據結構中才能看到這個union,其實並不復雜。本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。

1、union中可以定義多個成員,union的大小由最大的成員的大小決定。 
2、union成員共享同一塊大小的內存,一次只能使用其中的一個成員。 
3、對某一個成員賦值,會覆蓋其他成員的值(也不奇怪,因為他們共享一塊內存。但前提是成員所占字節數相同,當成員所占字節數不同時只會覆蓋相應字節上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因為char只占一個字節,而int占四個字節)

4、聯合體union的存放順序是所有成員都從低地址開始存放的。
下面看一個簡單的代碼:

 #include <stdio.h>
 
typedef union{
 char c;
 int a;
 int b;
}Demo;
 
int main(int argc, char **argv)
{
 Demo d;
 d.c = 'H';
 d.a = 10;
 d.b = 12;
 
 printf("size: %d\n", sizeof(d));
 printf("%c\t%d\t%d\n", d.c, d.a, d.b);
 
 return 0;
}

(轉)C語言union(聯合體 共用體) - 潛流 - pig在學習思考了

原創文章,轉載請注明:
本文出自程序人生 >> C語言union(聯合體 共用體)

ps:紅色字體部分為本人添加。


免責聲明!

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



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