赞
踩
联合体的定义与结构体相似,但是联合体往往会节省更多的空间,它的特点是所有成员共用一块内存空间,结构体也叫共用体
联合体中给某一成员赋值,其他成员值往往会跟着变化
#include <stdio.h>
union Un
{
char c;
int i;
};
int main()
{
union Un un = { 0 };
printf("%d\n", sizeof(un));
return 0;
}
定义联合体我们用的是union,定义格式与结构体相差不多,大括号里边是成员变量
输出结果:
按照结构体的标准来说,这里应该是8,但为什么会是4呢?
就是因为前边提到的:联合体的成员共用一块内存空间
联合变量的大小至少是最大成员变量的大小
#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); printf("%p\n", &(un.i)); printf("%p\n", &(un.c)); printf("%p\n", &un); return 0; }
我们发现第一行输出11223344被修改成了11223355
第二行联合体地址,联合体成员地址都是一个地址
所以我们验证了联合体成员变量共用一块内存
struct Un
{
char c;
int i;
};
union Un
{
char c;
int i;
};
结构体内存中,灰色的是浪费掉的内存
联合体的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
#include <stdio.h> union Un1 { char c[5];//1 int i;//4 }; //当成员中有数组时,用其数组中每个数据的数据类型来比较最大对齐数 //4为最大对齐数,最大数为5,对齐到4的整数倍,即为8 union Un2 { short c[7];//2 int i;//4 }; //4为最大对齐数,最大数为14,对齐到4的整数倍,即为16 int main() { printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2)); return 0; }
我们在采购物品时(图书,杯子,笔记本,衣服),可以写一个结构来录入它们的信息
struct 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;//尺⼨
};
我们用结构可以很快的写出来,但是这样会占用一些不必要的内存,例如图书没必要录入它的颜色,设计等属性,杯子也没有书名和作者,这样,我们的联合就可以发挥它的作用,在一定程度上节省内存
struct gift_list { int stock_number;//库存量 double price; //定价 int item_type;//商品类型 union { struct { char title[20];//书名 char author[20];//作者 int num_pages;//⻚数 }book; struct { int colors;//颜色 int sizes;//尺寸 char design[30];//设计 }cup; struct { char design[30];//设计 int colors;//颜⾊ int sizes;//尺⼨ }clothes; struct { int num_pages;//页数 int sizes;//尺寸 }notebook; }item; };
枚举就是一一列举的意思,枚举用enum来定义,定义方法也是类似结构体与联合体的方式
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Day就是枚举类型,大括号中的内容为枚举类型的可能取值,也叫枚举常量,这些枚举常量都是有值的,默认从0开始,依次递增1,也可以赋初始值
enum Day
{
Mon,
Tues,
Wed,
Thur=2,
Fri,
Sat,
Sun
};
从上到下值依次为0 1 2 2 3 4 5
中间赋值,前面从头开始为0,依次递增1,到该枚举常量时,取被赋予的值,然后往下还是依次递增1
enum Day
{
Mon=4,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
从上到下值依次为4 5 6 7 8 9 10
依次递增1
我们知道#define也可以完成枚举这样的效果,那为什么我们还要使用枚举呢?
①增强代码的可读与可维护性
②和#define相比枚举有类型检查,更加安全严谨
③便于调试,在预处理阶段,会删除#define定义的符号,直接用所替换的值替换,导致预处理与真实代码不统一,无法更好地调试
④使用方便,一次可以定义多个常量
⑤枚举遵循作用域规则,枚举声明在函数内,只能在函数内使用
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Day today = Mon;
使用枚举常量为枚举变量赋值,在C语言中可以用整数来给枚举变量赋值,但在C++中不可以
今日分享就到这里了~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。