1.结构体类型创建
定义一个结构体
struct Stu
{
int age;
char name[20];
char id[20];
char sex[5];
};
定义一个匿名结构体,同时将结构体实例化为x
struct
{
int a;
char b;
float c;
}x;
结构体的成员可以是标量,数组,指针,其他结构体,但是不能是自身,会触发无限递归
结构体初始化
struct Stu
{
char name[15];
int age;
};
struct Stu s = {"zhangsan",20};
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = { 10, {4,5},NULL};
struct Node n2={20,{5,6},NULL};
结构体内存对齐
1.第一个成员变量在与结构体变量偏移量为0的地址处
2.其他成员变量要对齐到对齐数的整数倍地址处
VS默认对齐数为8
linux默认对齐数为4
3.结构体的总大小为最大对齐数的整数倍
4.对于结构体嵌套这种情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小为所有最大对齐数的整数倍。
存在内存对齐的原因
1.不是所有的硬件平台都能访问任意地址的任意数据,即软件为硬件让步。
2.数据结构应该尽可能在自然边界对齐,否则处理器需要做两次内存访问。
3.结构体的内存对齐就是拿空间换时间
设计结构体时,如何既满足对齐,又节省空间
让占用小的成员尽量集中
位段
位段的成员必须是int unsigned int 或 signed int
struct A
{
int _a:2 //占用两个字节
int _b:5//占用5个字节
}