结构体
1. 结构体的创建
(1)在构建结构体之前,必须要对结构体进行声明。
例:struct student //描述一个学生,student为标签
{ char name[20];
Int age;
char sex[5];//内容不能为空
}; //此处的分号不能丢,此处也可写变量
(2)成员访问
2.1在(1)中的struct student{};相当于类型,比如int型,
Struct student s ;//s为变量
s中有name,age,sex,三个成员;
在访问成员是为(s.成员)的形式:例:s.age:访问的是age成员
2.2而如果需要访问指针指向的结构体变量时,应该解引用指针,这样就会获得指针指向的内容。
例:p为指向结构体变量的指针
Struct student *p=s;
(*p).name (p->name)
//访问成员,两种形式都可以
(3)初始化
例:(1)struct student n1={“henry”,20,“男”};//先声明了结构体,然后赋值
(2)Struct student{...}n2={“henry”,20,”男”};//在声明时就定义变量然后初始化。
2. 结构体的内存对齐
在结构体中声明成员时,成员在内存中存放时要遵循内存对齐的原则:平台原因和性能原因。
(1)struct s1
{ char c1;// 第一个成员的地址偏移量为0,所以不需要
/对齐,占一个字节
Int i;//第二个成员要考虑对齐,因为int 型占4个字节,而它要存放在自己对齐数的整数倍处,所以在第一个成员后空三个字节,这样才可以存放
Char c2;//一共存放了8个字节,加上char为9个,但是9不是最大对齐数4的整数倍,所以要添三个字节,结果为12个。
};
(2)struct s2
{ char c1;//为1,添3个
Struct s1 s3;//s1中的最大对齐数为4,则它的对齐数为4,它的大小为12
Double d;//对齐数为8,16 为8的整数倍,所以为24;24又为最大对齐数8 的整数倍,所以结果为24
};
总结:(1)对齐数:编译器默认的和该成员大小的较小值
Visual环境为8,Linux为4。
(2)总大小为成员中最大对齐数的整数倍。
(3)除了第一个,后一个成员之前的都为自己对齐数的整数倍。
(4)结构体的对齐数为成员中的最大对齐数。
3.结构体传参
struct student {...}s;
Int main()
{ print (&s);//传地址,会提高性能
}
位段
1.位段的声明和结构体相似。
Struct k
{ int _a:2;//2个比特位,
Int _b:5;//5个比特位,
Int _c:10;//10 个比特位
/前三个只用占用17个比特位,在32 位平台上还有15个空余
Int _d:30;// 30个比特位,不够用,重新开辟一个,所以一共占
} ; 8个字节,两个整型
注意:成员必须是int ,unsigned int 和 signed int ,char整型族
2.位段也需要注意内存对齐
struct s
{
char a : 3;//3个比特位
char b : 4;//4个比特位,共7个,占一个字节
char c : 5;//5个比特位,一个字节
char d : 4;//4个比特位,一个字节
Int e : 4;//前边共三个,补充一个,加上4,一共8个
};
枚举
enum day//枚举类型
{
Mon=1,
Tue=2,
Wed=3,
Sun=7,
}c1;
Enum day c1=sun;//只能拿枚举常量赋值
不可以直接赋值 :c1=7;
联合(共用体)
联合体的特点:至少要保存最大的成员
union un
{
short c[7];//大小为7,对齐到4 的整数倍12 处
int i;//加上4,为16
};