聯合體的特點
1、聯合體是一種結構,在這個結構中能夠不同類型的成員,但同一時間僅僅能存放當中的一種。
#include <stdio.h> union Demo { int a; char b; long long c; }; int main(){ union Demo demo; demo.a = 10; printf("a=%d\n", demo.a); printf("b=%d\n", demo.b); printf("c=%d\n", demo.c); return 0; }

2、聯合體全部成員的首地址都是一樣的(共享同一塊內存空間)。
#include <stdio.h> union Demo { int a; char b; long long c; }; int main(){ printf("%p\n", &demo.a); printf("%p\n", &demo.b); printf("%p\n", &demo.c); return 0; }

3、聯合體所占的內存的長度,一般等於其最大成員的內存長度。
#include <stdio.h> union Demo { int a; char b; long long c; }; int main(){ union Demo demo; printf("%d\n", sizeof(demo)); return 0; }

4、聯合體成員的對齊方式要適合全部的成員。
#include <stdio.h> union Demo { int a;// 4個字節 char b;// 2個字節 long long c;// 8個字節 char d[11];// 11個字節 }; int main(){ union Demo demo; printf("%d\n", sizeof(demo)); return 0; }
上面聯合體變量demo的大小之所以不是11個字節而是16個字節,是由於這里存在字節對齊問題:
11既不能被2整除,也不能被4,、8整除,因此補充字節到16,因此就符合全部成員自身內存對齊了。
這里能夠看出聯合體所占空間的大小,不僅取決於最大成員的內存大小。並且跟全部成員的數據類型有關系。其大小必須滿足兩個必須條件:
1、大小足夠容納其最寬的成員。
2、大小能被全部成員類型的大小所整除。
聯合體內部指針成員變量
對於聯合體來講最主要的原則是。一次僅僅操作一個成員變量,假設這個變量是指針,那么一定是處理完指針相應的內存之后再來使用其它成員。
