1.结构体
- 声明
struct<结构体标识名>
{
类型名1 结构体成员列表1;
类型名2 结构体成员列表2;
. .
. .
. .
类型名n 结构体成员列表n;
};
例如:声明一个日期结构体类型
struct date
{
int year;
int month;
int day;
};
注:(1)struct是关键字。“结构体标识名”可以省略。
(2)花括号后的“;”不能省略。
-
定义和初始化
(1)先声明结构体类型,再定义结构体变量。
struct date
{
int year;
int month;
int day;
};
struct date x,y;
(2)在声明结构体类型的同时定义结构体变量。
struct date
{
int year;
int month;
int day;
}x,y;
2. 内存对齐规则
本质:牺牲空间换取时间
(1)取pack(n),(linux默认4,window默认8),取结构体中类型最大值m。m和n取小为Y,作为外对齐大小。
(2)将每一个结构体成员大小与Y值比较,取小者为x作为内对齐大小。
(3)所谓按x对齐,即为地址(设起始地址为0)能被x整除的地方开始存放数据。
(4)外部对齐原则是结束地址是Y的整数倍。
例如:
struct type
{
char a;//1
double b;//8
float c;//4
short d;//2
}
步骤:
(1)n=8,m=8,>>Y=8
(2)x为1 8 4 2
(3)(4)
3.位段
- 定义:位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”(bitfield)。利用位段能够用较少的位数存储数据。
- 位段和结构体声明的不同
(1)位段的成员必须是int ,unsigned int或signed int。
(2)位段的成员名后边有一个冒号和一个数字。
例如:
struct TYPE
{
int _a:7;
int _b:5;
int _c:25;
}
- 计算大小:int是4个字节,32个比特位,先开辟4个字节的空间可以存下a+b共12个比特位,但c是25个比特位,第一块空间剩下的不够存储,所以再开辟一块4个字节的空间存储c,则TYPE位段的大小为 8个字节。
4.枚举
例如:
enum color
{
RED,
YELLOW,
GREEN
};
注:{ }中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候可以赋初值。
例如:
enum color
{
RED=1,
YELLOW=3,
GREEN=5
};
5.共用体
- 声明
union<共用体标识名>
{
类型名1 共用体成员列表1;
类型名2 共用体成员列表2;
. .
. .
. .
类型名n 共用体成员列表n;
}
注:(1)一个共用体变量的存储容量一般取决于各成员中所占内存容量最大的那个成员。
(2)共用体变量初始化时只能对它的第一个成员进行初始化。
(3)共用体变量所有成员共享用同一段存储空间,因此它们的首地址相同,并且与共用体变量的地址相同。