结构体:任意由程序员定义的新类型
struct student (标识符)
{
};(末尾分号不能省略)
定义结构体类型的方法:
1.先声明结构体,再定义变量名。
2.在声明类型的同时定义变量。
3.直接定义结构体类型变量
s1,s2在全局区,若省略student,使用者只能使用定义好的全局变量。
结构体变量的引用
1.结构体整体不能打印,只能对结构体变量中的各个成员分别进行输入和输出。如下:
2.对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。
注:int i 抽象与具体的关系
. 为结构体成员运算符
3.可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
结构体变量的初始化
{}为初始化链表,顺序必须与声明的顺序一致。
若只初始化一部分,则其余部分为0,与数组相似。
结构体也可以被嵌套
结构体对齐规则:
1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
(test2中,最长的是struct test1,但要按照cpu字节数8对齐)
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
注:
1.若有结构体数组,则按数组基类型对齐,而非数组整体大小对其。
2.结构体对齐问题:提高cpu执行效率而舍弃内存。
结构体变量作为函数参数
结构体变量作为函数参数时,通常使用指针传参。效率高。
为了使用方便和使之直观,可以把(*p).num改用p->num来代替,它表示p所指向的结构体变量中的num成员。同样,(*p).name等价于p->name。也就是说,以下3种形式等价:
①结构体变量.成员名
②(*p).成员名
③ p->成员名 如:
结构体可以允许直接赋值;
结构体数组逆序
结构体变量之间整体不能相互比较,但成员可以相互比较
上式分别比较成绩和名字
用指针处理链表
1.值域:要装的东西本身
指针域:指向下一个节点
2.节点个数有限 ,头指针只保存第一个结点指针。
3.删除与插入算法复杂度都为1,效率高于数组
4.节点从堆上来,所有的链表从空链表开始,
5.链表不具有连续性,不能通过首元素地址+n访问第n个元素地址
6.分类:有头链表与无头链表
7.第一个有用的节点为头节点
8.空链表:真正有用的节点一个都不存在
判断是否为空链表: