赞
踩
- #include <stdio.h>
- //联合类型的声明
- union Un
- {
- char c;
- int i;
- };
- int main()
- {
- //联合变量的定义
- union Un un = {0};
- //计算连个变量的⼤⼩
- printf("%d\n", sizeof(un));
-
- return 0;
- }
-
- 输出结果: 4

联合体的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为来拿赫梯至少要有能力保存最大的那个成员,至少的意思是可能有内存对齐的情况)。
- //代码1
- #include <stdio.h>
- //联合类型的声明
- union Un
- {
- char c;
- int i;
- };
- int main()
- {
- //联合变量的定义
- union Un un = {0};
- // 下⾯输出的结果是⼀样的吗?
- printf("%p\n", &(un.i));
- printf("%p\n", &(un.c));
- printf("%p\n", &un);
- return 0;
- }
-
- 输出:
- 001AF85C
- 001AF85C
- 001AF85C

输出的三个地址一模一样,这也印证了之前说的联合体成员变量共用同一块地址。
- //代码2
- #include <stdio.h>
- //联合类型的声明
- union Un
- {
- char c;
- int i;
- };
- int main()
- {
- //联合变量的定义
- union Un un = {0};
- un.i = 0x11223344;
- un.c = 0x55;
- printf("%x\n", un.i);
- return 0;
- }
-
- 输出:
- 11223355

通过代码2的输出,我们发现将i的第四个字节内容修改为了55.
通过上面两段代码,我们可以活出un的内存布局:
- //结构体
-
- struct S
- {
- char c;
- int i;
- };
- struct S s = {0};
-
- //联合体
-
- union Un
- {
- char c;
- int i;
- };
- union Un un = {0};

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
- #include <stdio.h>
- union Un1
- {
- char c[5];
- int i;
- };
- union Un2
- {
- short c[7];
- int i;
- };
- int main()
- {
- //下⾯输出的结果是什么?
- printf("%d\n", sizeof(union Un1));
- printf("%d\n", sizeof(union Un2));
- return 0;
- }

输出结果:
图书:书名、作者、⻚数杯⼦:设计衬衫:设计、可选颜⾊、可选尺⼨
- struct gift_list
- {
- //公共属性
- int stock_number;//库存量
- double price; //定价
- int item_type;//商品类型
-
- //特殊属性
- char title[20];//书名
- char author[20];//作者
- int num_pages;//⻚数
-
- char design[30];//设计
- int colors;//颜⾊
- int sizes;//尺⼨
- };

如果我们没学过联合体,我们就会用上述代码的样式去定义成员变量。上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的。⽐如:商品是图书,就不需要design、colors、sizes。
所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。
- struct gift_list
- {
- int stock_number;//库存量
- double price; //定价
- int item_type;//商品类型
-
- union{
- struct
- {
- char title[20];//书名
- char author[20];//作者
- int num_pages;//⻚数
- }book;
- struct
- {
- char design[30];//设计
- }mug;
- struct
- {
- char design[30];//设计
- int colors;//颜⾊
- int sizes;//尺⼨
- }shirt;
- }item;
- };

之前我们讲过一个判断当前机器是大端小端的案例:
- int check_sys()
- {
- union
- {
- int i;
- char c;
- }un;
- un.i = 1;
- return un.c;//返回1是⼩端,返回0是⼤端
- }
使用联合体同样可以进行判断,甚至比之前的代码还简单。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。