本帖最后由 jackz007 于 2022-10-10 21:26 编辑
因为 in 和 a、b 共享内存,而在 in 中,x 靠前,占前 4 个字节,y 靠后,占后 4 个字节,而 e 的另两个成员 a 和 b 占用的也同样是 4 个字节,所以,e . a 和 e . b 以及 e . in . x 实际上构成了共享关系。
关于共用体 e 有以下几点需要明确:
1、e 中共有 3 个成员 in、a、b 共同分享内存,也就是说,这 3 个变量共享同一块内存,但是,in 是结构体,共有 2 个成员(x ,y),都是 int 型,而另外 2 个联合成员 a 和 b 也是 int 型,所以,in 、a、b 的内存共享实际上是 e . in . x、a、b 的内存共享,也就是说,这三个变量实质上就是同一个变量,而且,它们的类型相同,都是 int 型,所以,任何时候都有 e . in . x == e . a == e . b ;
2、在联合 e 的 3 个成员 in 、a、b 中,in 占用了 8 个字节,a 和 b 都是 4 个字节,所以,in 决定了整个共用体的占用空间。
3、既然 e . in . x、e . a、e . b 共享占用了联合体 e 的前 4 个字节,那么,毫无疑问,e . in . y 就 "独占" 了联合体 e 的后 4 个字节,之所以说 "独占",是因为与其它的成员不存在任何关联。
#include <stdio.h>
int main(void)
{
union EXAMPLE {
struct {
int x ;
int y ;
} in ;
int a ;
int b ;
} e ;
e . a = 1 ; // e . in . x = e . a = e . b = 1
e . b = 2 ; // e . in . x = e . a = e . b = 2
e . in . x = e . a * e . b ; // e . in . x = e . a * e . b = 2 * 2 = 4
e . in . y = e . a + e . b ; // e . in . y = e . a + e . b = 4 + 4 = 8
printf("%d , %d\n" , e . in . x , e . in . y) ; // 打印输出 4 , 8
}
|