【C语言进阶】结构体
在[C语言入门]的板块,我们浅显地讨论过结构体的内容,这一期将深刻介绍结构体,后面的一期内容会做联合、枚举相关的内容。
目录
1.结构体类型的声明
2.结构体的自引用
3.结构体变量的定义和初始化
4.结构体内存对齐(重点)
5.结构体传参
6.结构体实现位段(位段的填充&可移植性)
1.结构体类型的声明
结构体是一些值的集合,这些值称之为成员变量,结构的每个成员变量都可以是不同类型的变量;
关于结构体类型的定义,举一个简单的例子:写一个关于学生的结构体,成员列表含姓名、年龄。
有读者会问了,结构体中的成员变量不需要初始化吗?我们可以把结构体当做一个普通的类型,例如int、char类型,类型是修饰变量的,所以不需要初始化;
上图中的s1,s2是根据这个类型创造出的结构体变量,可以不加,此时这个两个结构体变量是全局变量,当然可以创建局部的结构体变量,如下图所示:
创建结构体变量的时候需要书写struct XXX 结构体变量名,过于繁琐,我们可以使用以下这种方式:
匿名结构体,不能手动创建结构体变量只能使用一次。
匿名结构体是有一个缺点的,那就是没有类型,如果两个匿名结构体的内部成员变量,我们依然认为这是两个不同类型的结构体。
能不能对匿名结构体进行使用typedef呢?是不行的,匿名结构体本身没有类型,所以不能进行简化。
我们还可以这么写,相当于创建了一个结构体指针。
2.结构体的自引用
我们知道在数据结构中有顺序表和链表。顺序表例如数组,可以理解成在内存中连续存储的数据;
链表在内存中是分散存储的,节点和节点之间是靠存储下一个节点的信息进行关联的,存储的节点类型和本类型完全一致,这就叫自引用。
这么写是有问题的,试想一下:next是你下一个节点的内容,next也存放着关于它下一个结构体的内容,如此以来只要链表一长,在最前面的结构体存的内容是海量的,所以为了解决这个问题,我们只需要存储下一个节点的地址即可,每一个节点只能获取下一个节点的相关信息,我们可以用结构体指针来指向下一个结构体;这就是我们常说的数据域+指针域。
3.结构体变量的定义和初始化
struct Point
{int x;int y;
}p1; // 结构体变量struct Point p2;// 定义结构体变量p2// 初始化,定义变量的同时赋初值
struct Point p3 = {x,y};struct Stu
{char name[15];int age;
};
struct Stu s = {"zhangsan",20};// 初始化
我们可以把结构体(类型)当做图纸,结构体变量当做具体的房子。
结构体中含结构体,进行初始化的时候,只需要加一个大括号即可~
我们可以使用结构体变量+.的形式访问结构体变量的成员变量。
4.结构体内存对齐(重点)
待续......