C杂讲 结构体 共用体 枚举

目录

知识点1【共用体】(了解)

知识点2【枚举】

 知识点3【结构体 与 共用体 的区别】


知识点1【共用体】(了解)

        共用体也叫联合体,使几个不同类型的变量共占一段内存(相互覆盖),也就是说共用体的成员共用一片内存,后赋值的成员变量的数据才是共用体的生效数据,因为前面的赋值已经被覆盖了。共用体所占内存至少能够容纳最大的成员变量所需的空间,应用场景,比如需要一种既可以存储int型数据也可以存储double型数据的变量。
 

共用体和结构体 区别

结构体的成员拥有独立的空间

共用体成员共享同一份的空间, 空间的大小由最大的成员类型长度决定

案例1:

共用体的成员虽然共享同一块空间 但是成员操作空间的大小由自身大小决定。

 

共用体的空间用 最大的成员 决定

union data
{
	char a;
	short b;
	int c;
};
void test05()
{
	union data A;
	printf("%d\n",sizeof(union data));//4
	
	A.a = 10;
	A.b = 20;
	A.c = 30;
	//共用体是最后一次 赋值有效(不严谨)

	printf("%d\n", A.a+A.b+A.c);//90
}

 案例:

union data
{
	char a;
	short b;
	int c;
};
void test05()
{
	union data A;
	printf("%d\n",sizeof(union data));//4
	
	A.c = 0x01020304;
	A.b = 0x0102;
	A.a = 0x01;

	printf("%#x\n", A.a+A.b+A.c);//0x01020203
}

知识点2【枚举】

枚举:将变量要赋的值 一一列举出来

enum poke_color{HONGTAO, MEIHUA, FANGKUAI, HEITAO};
enum poke_color p_color;//p_color只能赋HONGTAO, MEIHUA, FANGKUAI, HEITAO中的某一个值
//枚举列表的值 默认是从0开始
enum POKER{ HONGTAO, HEITAO=30, MEIHUA=40, FANGKUAI };
void test06()
{
	//poker_color 的取值为HONGTAO, HEITAO, MEIHUA, FANGKUAI中某一个
	enum POKER poker_color = HEITAO;
	
	printf("poker_color = %d\n", poker_color);//30
	printf("HONGTAO = %d\n", HONGTAO);//0
	printf("HEITAO = %d\n", HEITAO);//30
	printf("MEIHUA = %d\n", MEIHUA);//40
	printf("FANGKUAI = %d\n", FANGKUAI);//41
	
}
enum poke_color{HONGTAO, MEIHUA, FANGKUAI, HEITAO};
void test02()
{
    //p_color只能赋HONGTAO, MEIHUA, FANGKUAI, HEITAO中的某一个值
    enum poke_color p_color;
    p_color = MEIHUA;
    printf("p_color = %d\n", p_color);//1

    //默认情况下 枚举的符号常量 从0开始递增
    printf("%d %d %d %d\n", HONGTAO, MEIHUA, FANGKUAI, HEITAO);//0 1 2 3
    
    //可以在定义枚举符号常量时 修改枚举符号常量的值
    enum poke_color2{HONGTAO, MEIHUA=5, FANGKUAI, HEITAO};
    printf("%d %d %d %d\n", HONGTAO, MEIHUA, FANGKUAI, HEITAO);//0 1 2 3
}

 知识点3【结构体 与 共用体 的区别】

在书写形式上,其实共用体与结构体并没有太大的区别,只不过共用体在前面的书写为union,而结构体的书写为struct。

真正的区别为:在共用体中每个成员使用的都是同一块内存空间,而结构体的每一个成员都是占用不同的内存空间

那么既然共用体与结构体如此相似,为何我们补直接使用结构体呢?是因为内存真的不够我们使用么?其实不然。

结构体:struct

所有的成员拥有独立的空间

struct stu
{
    char a;
    short b;
    int c;
};// a  b  c成员有用独立的空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值