1.结构体定义
struct 结构体名
{
成员列表;
};
在主函数中初始化结构体,对于部分初始化,在成员名前加“ . ”,如:
2.结构体变量
在结构体后加变量名,如:
struct 结构体名
{
成员列表;
}s1,s2;
只能对结构体变量的各个成员分别进行输入输出;
结构体变量初始化可以在定义的时候初始化,也可以在调用的时候初始化;
3.结构体数组
4.结构体对齐
系统会浪费几个字节,对齐结构体,提高CPU执行效率,数组结构体对齐按照基类型对齐;
结构体对齐规则:
(1)结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
(2)结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数,最好是先声明小字节,后声明大字节;
(3)如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
(4)用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
5.结构体与指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变 量,用来指向
一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量 也可以用来指向结构
体数组中的元素。
指针可以写成(*s) . id,也可以写成 s -> id,当左边是指针时用s -> id,左边是变量时用(*s) . id;
非数组的结构体变量可以整体赋值;
结构体整体不可以比较,结构体内的成员可以比较;
快速排序法qsort和结构体指针:
6.用指针处理链表
链表每个节点的地址不连续,不能用+i 访问第i个节点,只能挨个访问;
有头链表:在指针和头节点之间加一个首节点,避免指针的指针出现;
头插法:每个新节点都是首节点;
遍历,计算有效字符个数,以及判断链表是否为空;
头插的原理:
首先定义一个pHead为空指针NULL;
创建一个新的节点pNew;
pHead先把他自身的地址NULL给pNew作地址;
pHead再指向pNew;
随后pNew的值被定义,此时pNew变成头节点,并且pHead指向pNew;pNew被销毁;
随后再创一个节点pNew;
pHead把头节点的地址再给pNew,此时,新的pNew指向头节点;
pHead再指向pNew,以此类推,
最终创建出一个链表,最开始插入的节点被排在最后一位节点,地址为NULL,最后一个插入的节点为头节点;