枚举与联合

目录

1.枚举

        1.1何为枚举?

       1.2枚举类型的定义

       1.3枚举的优点

 2.联合(共用体)

 2.1联合类型的定义

          2.2联合的特点

 2.3联合大小的计算


1.枚举

1.1何为枚举?

顾名思义就是一 一列举。

把可能的取值一 一列举。

比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一 一列举。
性别有:男、女、保密,也可以一 一列举。
月份有12个月,也可以一 一列举。

1.2枚举类型的定义

enum  [标签名称]
{
    成员声明列表
};

举例

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};
enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};
以上定义的 enum Day enum Sex enum Color 都是枚举类型。
{ } 中的内容是枚举类型的可能取值,也叫 枚举常量  

 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值

理解加深:

(1)枚举常量都是有值的

默认从0开始,依次递增1。

#include<stdio.h>
enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};

int main()
{
	printf("%d \n", RED);
	printf("%d \n", GREEN);
	printf("%d \n", BLUE);
	return 0;
}

 也可以赋初值。若只有前面赋值,后面开始,依次递增1。

#include<stdio.h>
enum Day//星期
{
	Mon,
	Tues,
	Wed=7,
	Thur,
	Fri=100,
	Sat=0,
	Sun
};

int main()
{
	printf("%d \n", Mon);
	printf("%d \n", Tues);
	printf("%d \n", Wed);
	printf("%d \n", Thur);
	printf("%d \n", Fri);
	printf("%d \n", Sat);
	printf("%d \n", Sun);
	return 0;
}

(2) 只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。

1.3枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点:
(1) 增加代码的可读性和可维护性
         比如:写项目的菜单。
(2)和 #define 定义的标识符比较枚举有类型检查,更加严谨。
          比如:#define定义的标识符常量是没有类型的。而使用枚举定义,其定义的常量是枚举类型,也是一种类型。
(3)便于调试
        比如:创建枚举变量后调试可以在监视窗口看到枚举常量的值。
        图1-1,1-2
  (4)  使用方便,一次可以定义多个常量

                                                           图1-1

                                                         图1-2

 2.联合(共用体)

 2.1联合类型的定义

 联合也是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

形式如下:

union [标签名称]
{
    成员声明列表
};

//联合类型的声明
union Un
{
 char c;
 int i;
};

2.2联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)。
下面两个例题可以充分表明 联合的特点
   例1
#include<stdio.h>
union Un
{
	int i;
	char c;
};
int main() {
	union Un un;
	// 下面输出的结果是一样的吗?
	printf("%d\n", &(un.i));
	printf("%d\n", &(un.c));
	return 0;
}

    例2

 

#include<stdio.h>
union Un
{
	int i;
	char c;
};
int main() {
	union Un un;
	//下面输出的结果是什么?
    un.i = 0x11223344;
    un.c = 0x55;
   printf("%x\n", un.i);
    return 0;
}

我们已经对 联合(共用体)有了一定的了解下面这道例题是运用联合(共用体)的一道典例

我相信一定可以让你对联合(共用体)的理解加深。

例题:判断当前计算机的大小端存储

#include<stdio.h>
int check_sys()
{
	union
	{
		int a;
		char c;
	}un = { .a = 1 };
	return un.c;
}

int main()
{
	if (check_sys())
	{
		printf("小端存储");
	}
	else
	{
		printf("大端存储");
	}
	return 0;
}

如果你对大小端存储不了解可以看本博主的这篇文章

http://t.csdn.cn/yTMvP

图解:

 2.3联合大小的计算

(1)联合的大小至少是最大成员的大小。

(2)当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

#include<stdio.h>

union Un1
{
	char c[5];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un1));
	return 0;
}

要对齐到最大对齐数的整数倍 

很明显浪费了3个字节。

 如果你对最大对齐数不了解可以看本博主的这篇文章

http://t.csdn.cn/0GRk6

以上为我个人的小分享,如有问题,欢迎讨论!!!  

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值