1.结构体基础知识
a.认识结构体
结构体是一些值的集合,这些值称为成员变量.结构体的每个成员可以是不同类型的变量.
//声明一个结构体类型
//声明一个学生类型(Stu就是你对这个结构体的称呼)
struct Stu
{
char name[20];
char tele[12]; //成员变量
char sex[10];
int age;
}s4,s5,s6;//全局变量
struct Stu s3;//全局变量
int main()
{
//创建结构体变量(局部的)
struct Stu s1;
struct Stu s2;
}
b.结构体自引用
//结构体的自引用
typedef struct Node
{
int data;
//struct Node n; sizeof(struct Node)无限包含下去错误
struct Node* next;//找到同类型的其它变量
}Node;//你只用关心这里就好了,我们给结构体创建了另一个名字
c.结构体嵌套使用
struct T
{
double weight;
int age;
};
struct S
{
char c;
int a;
double d;
char arr[20];
struct T st;//嵌套了上一个结构体
};
int main()
{
struct S s = { 'c',100,3.14,"hello disposable",{55.6,20} };
printf("%c %d %lf %s %lf %d\n", s.c, s.a, s.d, s.arr,s.st.weight,s.st.age);
}
2.结构体对齐(重点)
//结构体内存对齐
struct s1
{
char c1;
int a;
char c2;
};
struct s2
{
char c1;
char c2;
int a;
};
int main()
{
struct s1 s1 = { 0 };
printf("声明的第一个结构体大小为%d字节\n", sizeof(struct s1));//12
printf("该结构体变量大小为%d字节\n", sizeof(s1));//12
struct s2 s2 = { 0 };
printf("声明的第二个结构体大小为%d字节\n", sizeof(struct s2));//8
printf("该结构体变量大小为%d字节\n", sizeof(s2));//8
}
明明两个结构体的内容一样为什么它们所占内存的大小不一样呢?对就是结构体需要对齐的原因.
我们先看一下结构体对齐规则:你可能初次看有点懵,等会后面我会引出例子来讲解.规则:
a.结构体中的第一个成员在与结构体变量偏移量为0的地址处
b.其它成员变量要对齐到一个名叫对齐数的整数倍的地址处.补充:对齐数=编译器默认的一个对齐数与该结构体中的成员变量大小中的较小值.我使用的是vs2022,默认对齐数为8.
c.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍.
d.如果存在了嵌套结构体的情况,嵌套的结构体则对齐到自己的成员变量中最大对齐数的整数倍处,包含该嵌套结构体的结构体大小为其成员变量(包含嵌套结构体)最大对齐数的整数倍
看到这里你应该懵了吧,没关系看例子
A.先看看上面的那个例子这是结构体1的
A.1这是结构体2的
B例子2
struct s3
{
double d;
char c;
int i;
};
int main()
{
printf("该结构体大小为%d字节\n", sizeof(struct s3));//16
}
C例子3
struct s2
{
char c1;
char c2;
int a;
};
struct s3
{
int d;
char c;
int i;
struct s2 t;//结构体嵌套
};
int main()
{
printf("该结构体大小为%d字节\n", sizeof(struct s3));//20
}
C.1内存图
D.总结
记住要好好动笔哦,如果有什么问题欢迎评论区留言,点个赞吧,蟹蟹!