第11章 结构体与共用体
- 结构体
声明一个结构体类型的一般形式为
在声明类型的同时定义变量
直接定义结构体类型变量
即不出现结构体名称;
结构体的定义与引用
结构体的初始化
部分内容的初始化
关于结构体对齐的问题
1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
目的:提高cpu的运行速率,用空间来换取时间;
结构体的嵌套问题
结构体为函数传参(使用指针传参);
关于指向运算符->
观察左边是指针还是变量类型,如果是指针就可以用指向运算符;
结构体数组的遍历
结构体可以整体赋值s1 = s2;
结构体成员之间有有序性,无连续性;
一个程序可以分为数据结构 + 算法两部分;
结束输出缓冲区的方法:
- 遇到“\n”输出,结束并刷新输出缓冲区;
- Fflush(stdout)函数的使用,强制输出并刷新输出缓冲区;
- 缓冲区满,输出缓冲区会输出并刷新;
- 用指针处理链表
链表的一般形式:
链表节点地址并不连续,不能采用累加的方式来访问下一个节点,但可以进行快速插入和删除;
无头链表和有头链表是两种常见的数据结构,它们主要用于表示线性的元素集合。
有头链表通常包含一个额外的节点,称为头结点(head),它指向链表的第一个实际元素。这种设计使得添加、删除节点操作更为方便,因为可以直接通过头结点来访问第一个元素,并以此为基础遍历整个链表。每个节点通常包含一个指向前一个节点的引用和一个指向下一个节点的引用。
无头链表则没有专门用于标识起始位置的头结点。在这种结构中,链表的第一个节点直接指向第二个节点,最后一个节点的next字段通常是空(NULL)。要访问链表,需要从某个已知的非头节点开始。
链表在进行插入和删除某个节点时,算法复杂度较低;