自定义类型(位段+枚举+联合)

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义类型(位段+枚举+联合)相关的知识,希望对你有一定的参考价值。

1.位段

位段的声明和结构体类似,但是有两个不同。
1.位段的成员必须是int,unsigned int 或char类型的。
2. 位段成员名后面有一个冒号和一个数字。

例如:
struct S{
          int  a:2;
          int  b:3;
          char c:4;
};
位段后面的数字代表比特位的个数。

位段的内存分配

#include<stdio.h>
struct stu{
	char a : 1;
	char b : 3;
	char c : 6;
	char d : 7;
};
int main()
{
	char arr[4] = { 0 };
	struct stu *sp = (struct stu*)arr;
	sp->a = 1;
	sp->b = 3;
	sp->c = 6;
	sp->d = 7;
	printf("%d\\n", sizeof(struct stu));
	return 0;
}

在这里插入图片描述
arr的地址里的数值是这样的,为什么呢?
在这里插入图片描述
在这里插入图片描述
位段可以节省空间,但是跨平台存在问题,可移植性差。
注意:位段大小最小为里面元素的类型大小。位段不用对齐

2.枚举

枚举的关键字为enum,{}中的内容是枚举的可能取值,也叫枚举常量,类型是整形的。这些可能取值都是有值的,默认从0开始,依次递增1,在定义时也可以赋初值,后面没赋值的依次递增1。

enum color{
	YELLOW,
	GREEN,
	WHILE=2,
	BLACK,
};

enum color y = YELLOW;//定义变量

枚举的优点:
1,增加了代码的可读性和可维护性
2,和#define定义的标识符相比枚举有类型检查,而不是仅仅的简单替换
3,防止了命名污染
4,便于调试
5,使用方便,一次可以定义多个常量

3.联合(共同体)

联合是一种特殊的自定义类型,关键字为union,特征是{}里的成员公用同一块空间。

union n{
	char a;
	int i;
};
	union n s;//定义变量
	s.a = 1;//赋值

特点:
由于联合体是共用一块内存空间的,所以一个联合体变量的大小至少是其最大成员的大小,要保证联合至少有能力保存最大的那个成员。

联合体对齐问题

- 联合体的大小至少时最大成员的大小
- 当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。

union n{
	char a[5];//最大对齐数1
	int i;//最大对齐数4
};
//最大成员大小5,最大对齐数为4,不能整除,对齐到能整除 所以这个联合的大小为8.

以上是关于自定义类型(位段+枚举+联合)的主要内容,如果未能解决你的问题,请参考以下文章

自定义类型(位段+枚举+联合)

自定义类型详解(结构体+位段+枚举+联合)

C语言自定义数据类型:结构体,枚举,联合

C语言自定义数据类型:结构体,枚举,联合

C语言自定义数据类型:结构体,枚举,联合

#yyds干货盘点# C语言自定义类型的介绍(结构体,枚举,联合体,位段)