【零基础C语言】联合体(共用体)和枚举

本文详细介绍了C语言中的自定义类型联合体和枚举,包括联合体的声明、特点(共享内存空间和大小计算)、节省空间的应用实例以及如何用联合体判断机器的存储方式。同时,讨论了枚举的声明、优点和示例。
摘要由CSDN通过智能技术生成

目录

自定义类型:联合体(共用体)和枚举

1.自定义类型:联合体(共用体)

 1.1 联合体的声明

1.2 联合体的特点

​编辑1.3 联合体的大小计算 

 1.4使⽤联合体是可以节省空间的

 1.5使用联合体写一个程序判断机器是大端还是小端存储

 2.自定义类型:枚举

 2.1枚举的声明

 2.2 枚举变量的优点


自定义类型:联合体(共用体)和枚举

1.自定义类型:联合体(共用体)

 联合体和结构体一样,可以又一个或者多个成员组成,成员也可以是不同的类型但是这些成员是共用一块空间的。

 1.1 联合体的声明

union S
{
	char c;
	int i;
};

int main()
{
	union S s = { 0 };
	s.c = 1;
	printf("s.i = %d\n", s.i); // 1
	printf("sizeof(s) = %zd\n", sizeof(s)); // 4
	return 0;
}

 由于共用一块空间我们可以看到,我们赋值s.c,但是当我们打印s.i时依然是1。
 由于共用一块空间我们可以看到, 计算整个联合体类型s时大小为4。

1.2 联合体的特点

 联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u = { 0 };
	printf("&(u.c) = %p\n", &(u.c));
	printf("&(u.i) = %p\n", &(u.i));
	printf("&u     = %p\n", &u);
	return 0;
}
// 存储地址一样

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u = { 0 };
	u.i = 0x11223344;
	printf("u.i = %x\n", u.i);
	printf("u.c = %x\n", u.c);
	return 0;
}
// 小端存储,共用空间

1.3 联合体的大小计算 

  •  联合的⼤⼩⾄少是最⼤成员的⼤⼩。
  • 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

#include <stdio.h>
union Un1
{               //大小    个数
	char c[10]; // 1   -   10
	int i;      // 4   -   1
}; 
union Un2
{              // 大小     个数
	short c[3];//  2   -   3
	int i;     //  4   -   1
};
int main()
{
	//下⾯输出的结果是什么?
	printf("%zd\n", sizeof(union Un1)); //12
	printf("%zd\n", sizeof(union Un2)); //8
	return 0;
}

 1.4使⽤联合体是可以节省空间的

举例:
⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、⻚数
杯⼦:设计
衬衫:设计、可选颜⾊、可选尺⼨

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 size; //尺寸
		}shirt;

	}item;

};

 1.5使用联合体写一个程序判断机器是大端还是小端存储

int check()
{
	union U
	{
		char c;
		int i;
	};
	union U u = { 0 };
	u.i = 1;
	return (u.c);
}

int main()
{
	int ret = check();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

 2.自定义类型:枚举

  • 枚举顾名思义就是⼀⼀列举。
  • 把可能的取值⼀⼀列举。
  • ⽐如我们现实⽣活中:
  • ⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
  • 性别有:男、⼥、保密,也可以⼀⼀列举
  • ⽉份有12个⽉,也可以⼀⼀列举
  • 三原⾊,也是可以意义列举

 2.1枚举的声明

enum Colcor //颜色
{
	RED,
	BLUE,
	GREEN
};
// 枚举类型 - enum Colcor

// RED,BLUE,GREEN 属于枚举变量

//枚举变量的值默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

 2.2 枚举变量的优点

 枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

//题目:

//1.下面代码的结果是:
enum ENUM_A
{
	X1,
	Y1,
	Z1 = 255,
	A1,
	B1,
};
int main()
{
	enum ENUM_A enumA = Y1;
	enum ENUM_A enumB = B1;
	printf("enumA = %d\nenumB = %d\n", enumA, enumB);
	return 0;
}

//因为枚举变量默认从0开始,X1=0,Y1=1,

//但是Z1 = 255,所有后面从255开始数起, A1=256,B1=257。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值