轉自: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(聯合體 共用體)ps:紅色字體部分為本人添加。