一,结构体类型的声明
1.结构体的声明
struct tag //结构体类型名
{
member-list; //结构体成员
}; //分号不能丢
2,结构体类型的创建和初始化
struct stu
{
char name[20];//姓名
int age;//年龄
char sex[5];//性别
};
int main()
{
struct stu s = { "张三",20,"男"}; //创建一个结构体变量s
printf("%s\n", s.name);
printf("%d\n", s.age);
printf("%s\n", s.sex);
}
这种创建是固有化的,最普遍简单的创建方式,下面这种为匿名创建
struct
{
char name[20];//姓名
int age;//年龄
char sex[5];//性别
}s;
这是一个匿名结构体类型,没有名字,直接创建一个结构体变量s,如果这样创建,就不能再创建其他的结构体变量。
3,结构体的自引用
struct node
{
int data;
struct node* next;
};
结构体的自引用可以理解为上图的方式,先存放一个整形变量,再存一个结构体指针,该指针指向下一个结构体。
二,结构体内存对齐
该部分知识是用来计算结构体内存大小的。
内存对齐规则:
1,结构体第一个成员对齐到和结构体起始位置偏移量为0的地址处。
2,其他成员要对齐到某一个数字(对齐数)的整数倍的地址处。
对齐数=编译器默认的对齐数与该成员变量大小的较小值。vs中默认为8.
3,结构体的总大小为最大对齐数(每个成员都有一个对齐数,所有对齐数中最大的)的整数倍。
4,如果存在了结构体嵌套,嵌套的结构体成员存到自己成员最大对齐数的整数倍处,最后结构体的大小是 最大对齐数(每个成员都有一个对齐数,所有对齐数中最大的)的整数倍。
存在结构体嵌套
内存对齐的原因:在访问未对齐的内存时,处理器需要访问两次才能拿到数据;而内存对齐时,只需在对齐的位置访问一次就可以拿到数据,虽然浪费了空间,但是节省了时间。也就是拿时间来换取空间的做法。
三,位段
1,位段的成员可以是int, unsigned int ,char等。
2,位段的后面必须有一个冒号和一个数字。
struct s
{
int a:2; //a只占2个比特位
int b:5; //b只占5个比特位
int c:10; //c只占10个比特位
int d : 30; //d只占30个比特位
};
可以看出,位段是用来节省内存的。