聯合體的特點
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、大小能被全部成員類型的大小所整除。
聯合體內部指針成員變量
對於聯合體來講最主要的原則是。一次僅僅操作一個成員變量,假設這個變量是指針,那么一定是處理完指針相應的內存之后再來使用其它成員。

