自定义类型:联合体和枚举

目录

1.联合体类型的声明

1.1联合体类型声明

2.联合体的特点

3.联合体大小的计算

3.1计算规则:

 3.2运用联合体实现大小端判断

4.枚举类型的声明

5.枚举类型的优点

6.枚举类型的使用


1.联合体类型的声明

1.1联合体类型声明

与结构体相似,联合体也是由一个及以上的成员组成,成员可以是不同类型的数据;但与结构体不同的是,编译器只给最大的成员分配足够的内存空间,即所有成员共用一块内存空间,所以联合体也叫做共用体。

联合体的声明与结构体也类似,即使用union来声明:

union U
{
    char c;
    int i;
};

共用了一块内存,显而易见给其中一个成员赋值,其他成员的值也会跟着改变。比如:

#include <stdio.h>

union U
{
	char c;
	int i;
};

int main()
{
	union U a = { 0 };
	a.c = 1;
	printf("%d\n", a.c);
	printf("%d\n", a.i);
	printf("%zu\n", sizeof(union U));

	return 0;
}

 改变了a.c,因为共用同一块内存所以也改变了a.i,那么该联合体的大小为什么是4呢?

2.联合体的特点

既然联合体的成员共用同一块内存,那么这个联合体至少要保证最大的成员,所以联合体的大小至少是最大成员的大小。

比如上面的联合体U:

 我们再以相同成员的结合体类型比较一下:

struct U
{
	char c;
	int i;
};

 大小为8个字节,中间红色的地方浪费掉了。

(如果忘记结构体相关知识可以移步http://t.csdnimg.cn/4a1Dx

3.联合体大小的计算

3.1计算规则:

1.联合体大小至少是最大成员的大小

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

比如:

#include <stdio.h>

union un
{
	int i;
	char j[9];
};

union un2
{
	int i;
	char j[7];
};

int main()
{
	printf("%zu\n", sizeof(union un));
	printf("%zu\n", sizeof(union un2));
	return 0;
}

 

 

 3.2运用联合体实现大小端判断

前几章向大家介绍了大小端字节序存储,其中就提及过运用联合体实现大小端存储的判断,现在我们再来回顾一下:

#include <stdio.h>

int check_sys()
{
	union       //这里只使用一次,就匿名了
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}

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

 这里十分巧妙地利用了联合体的共用内存的特性,将1赋值给int类型的i,在通过char类型的c访问一个字节,进而判断大小端。(大小端介绍http://t.csdnimg.cn/5g19W

4.枚举类型的声明

枚举,就是一一列举,就是定义标识符常量,将某一具有意义的标识符定义为枚举常量,比如:

#include <stdio.h>

enum week
{
	Mon = 1,      //注意是  ,
	Tues = 2,
	Wed = 3,
	Thur = 4,
	fir = 5,
	satur = 6,
	sun = 0
};

int main()
{
	printf("%d %d", Mon, Wed);;

	return 0;
}

 

当枚举声明是没有初始化也是可以的,会默认从0开始,依次递增1:

 如果在中间初始化为其他值,会怎么样呢?

#include <stdio.h>

enum week
{
	Sun,
	Mon,      //注意是  ,
	Tues = 123,
	Wed,
	Thur =0,
	fir,
	Satur
};

int main()
{
	printf("%d %d %d %d %d %d %d ", Sun, Mon, Tues, Wed, Thur, fir, Satur);

	return 0;
}

 可以看出下一个未初始化的值会根据上一个值再加上1变为自己的值,同时我们可以看出,枚举常量是允许重复的。

5.枚举类型的优点

我们知道,定义常量还可以使用#define,那跟枚举由什么不同之处呢?枚举有什么优点呢?

1.增加代码的可读性和可维护性

2.#define定义常量是无类型的,enum定义的标识符是有类型的,会有类型检查,会更加严谨

3.便于调试,预处理阶段会删除#define定义的字符

4.可以一次定义多个常量

5.枚举常量遵循作用域规则的,声明再函数内部,只能在函数内部使用。

6.枚举类型的使用

#include <stdio.h>

enum week
{
	Sun,
	Mon,      //注意是  ,
	Tues = 123,
	Wed,
	Thur =0,
	fir,
	Satur
};

int main()
{
	enum week day = Mon;//只能使用声明的值
	printf("%d\n", day);

	return 0;
}

好了,以上就是本期的全部内容,如果对你有帮助的话,那就点点赞吧(  

下期再见,白白(^///^)

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值