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