今天我们来说一下自定义类型,包含结构体,位段,联合,枚举。
首先来看结构体所包含的要点,结构体类型创建 ,结构体初始化及结构体内存对齐的问题。
一、结构体类型的创建分为两大类。
1,有名结构体的创建
(1). 定义类型的同时,完成变量的定义。
struct Student
{
char name[100] ;
char sex ;
int age ;
}stu;
struct Student 称为类型,student为变量。
(2).先有类型,再定义变量。
struct Student
{
char name[100];
char sex;
int age;
};
struct student s;
2,匿名结构体的创建
struct
{
char name[100];
char sex;
int age;
}student;
二、结构体初始化
1.定义的同时初始化。
struct student 1={"毛毛","女",20};
2.先定义再逐个初始化
struct student 2;
student 2 name = "毛毛";
student 2 sex = "女";
student 2 age = 20;
3.先定义再一次性初始化
struct student 3;
3 = (struct student){"毛毛" ,"女" ,20};
4.指定将数据赋值给指定的属性
struct student 4 = { name="毛毛",sex = "女",age = 20};
三、结构体内存对齐
结构体的内存对齐有两个原则。
1.结构体中的每个元素按照定义顺序一个个放入内存中,但并不是紧密排列的,从结构体存储的首地址开始,元素都按照自己的大小来划分内存,所以元素放置的位置一定在自己宽度的整数倍上开始。
2.根据第一个原则计算后,检查计算出的结果是不是存储单元中最宽元素长度的整数倍,如果不是,则要补齐为它的整数倍。
举个例子
struct X
{
char a;
double b;
int c;
}
s;
此例中,a占了内存中第0个字节,b进入存储单元的时候,以自己的8个字节进行划分,认为第一个 八字节已经被占用,所以b占了第8到第15个字节,当c进入存储单元的时候,以自己的4个字节进行划分,认为前三个 四字节的空间已经被占用,所以c占用第16到第19个字节。即计算出的结果为20,但20不为8的整数倍,所以补齐应为24。