DAY 12 结构体 共用体 枚举02

1.结构体

结构体对齐(了解)

概述

typedef struct Data01
{
char a;
int b;
}Data01;
typedef struct Data02
{
char a;
char b;
}Data02;
void fun01(){
printf("%ld\n",sizeof(Data01));
printf("%ld\n",sizeof(Data02));
}
特点:
不对齐
                优点:占用空间小
                缺点:速度慢
对齐
                优点:速度快
                缺点:占用空间大
注意
        如果在结构体中出现了数组,数组可以看成多个变量的集合
自动对其原则
原则
1, 结构体中的第一个成员在与结构体变量 , 偏移量为 0 的地址处
2, 确定结构体的分配单位(结构体体中最大的基本类型长度)
3, 其他成员的偏移量 == 成员自身长度的整数倍
4, 收尾工作:结构体的总大小 == 分配单位的整数倍。
注意 : 按成员顺序从上向下
示例
typedef struct Data01
{
char a;
int b;
}Data01;
typedef struct Data02
{
char a;
char b;
}Data02;
typedef struct Data03
{
char a;
short b;
int c;
}Data03;
typedef struct Data04
{
char a;
short b;
Data01 c;
int d;
}Data04;
强制对齐原则
        #pragma pack (value)时的指定对齐值 value 1 2 4 8
示例
#pragma pack(1)
typedef struct data05
{
char c;
int a;
}Data05;
void fun02()
{
printf("%ld\n",sizeof(Data05));
}
位域
概述
结构体的成员以二进制位位单位存储,这种就叫位域 ( 位段 )
DAY 12 结构体 共用体 枚举02_第1张图片
unsigned int a:2; 表示 a 只占 int 类型中 2 位二进制位。 a 的类型还是 unsigned int
abcd 叫相邻位域,可以压缩。不能超过自身类型大小。
注意:
        
1 、不能对位域取地址
2 、给位域赋值 不要超过位域的大小(会溢出)
示例:
        
typedef struct data06
{
unsigned char a:2;
unsigned char b:2;
unsigned char c:2;
unsigned char d:2;
}Data06;
void fun03()
{
printf("%ld\n",sizeof(Data06));// 长度 1 字节
}
示例 2: 另起一个单元存储
typedef struct data07
{
unsigned char a:2;
unsigned char b:2;
unsigned char c:2;
unsigned char :0;
unsigned char d:2;
}Data07;
void fun04()
{
printf("%ld\n",sizeof(Data07));// 长度 2
}
示例 3: 无意义位段
typedef struct data08
{
unsigned char a:2;
unsigned char b:2;
unsigned char :2;
unsigned char d:2;
}Data08;
void fun05()
{
printf("%ld\n",sizeof(Data08));// 长度 1
}

2.共用体

关键字 :union
特点:
         所有成员共用一块空间
示例:
//a b c 共用同一块空间(最大的成员类型决定)。
union Data09
{
char a;
short b;
int c;
};
void fun06()
{
union Data09 d01;
printf("%ld\n",sizeof(d01));// 长度 4
}
虽然共用体成员在同一块空间,但是每个成员操作空间的大小 是由成员自身类型决定。
DAY 12 结构体 共用体 枚举02_第2张图片
示例2:
union Data09
{
char a;
short b;
int c;
};
void fun07()
{
union Data09 d01;
d01.a = 10;
d01.b = 20;
d01.c = 30;
printf("%d\n",d01.a+d01.b+d01.c);
}

示例3:

union Data09
{
char a;
short b;
int c;
};
void fun08()
{
union Data09 d01;
d01.a = 0x01;
d01.b = 0x0102;
d01.c = 0x01020304;
printf("%d\n",d01.a+d01.b+d01.c);
}

3.枚举

关键字 :enum
特点
        限定其值的范围
概念 : 枚举就是将枚举变量可以赋的值一一列举出来
语法
        
enum 枚举名称
{
1,
2,
3,
...
n
}
注意 :
枚举中的值为符号常量 , 也是枚举变量可以赋的值
枚举列表中的值从 0 递增
示例1:
enum Type
{
OK,
ERROR,
OVER
};
void fun08()
{
enum Type t1 = OK;
enum Type t2 = ERROR;
enum Type t3 = OVER;
printf("%d %d %d\n",OK,ERROR,OVER);
}
示例2:
enum Type2
{
NUM01,
NUM02 = 3,
NUM03
};
void fun09()
{
enum Type2 t1 = NUM01;
enum Type2 t2 = NUM02;
enum Type2 t3 = NUM03;
printf("%d %d %d\n",NUM01,NUM02,NUM03);
}

你可能感兴趣的:(C语言,数据结构,c语言,开发语言)