结构体声明
1.初始化
//结尾分号不能掉
2.特殊声明
//省略了标签类,C语言不会识别相等,省略了的声明基本只能使用一次
p=&x 就是不合法的
自引用:用地址
即结构中包含一个类型为该结构本身的成员是否可以呢?
是不可以的,这样sizeof就会无穷大,是不合理的
正确的自引用方式:取结构体地址
运用:链表
数据结构:其实是数据在内存中的存储和组织的结构
线性数据结构:顺序表,链表,栈,队列
注意:定义结构体(typedef) 中就不要用匿名结构体了
匿名结构体类型是无法自引用的
结构体内存对齐
对齐规则
要计算结构体大小,首先得掌握结构体的对齐规则:
1. 结构体的第一个成员对齐到偏移量为0的位置
2.其他数字对齐到处对齐数整数倍的地址
对齐数==(编译器默认的 与 该成员变量 的较小值)
vs中默认为8 , linux中gcc没有默认对齐数,就是自身的大小
3.结构体总大小为最大对齐数的整数倍
4.嵌套结构体成员对其自己的成员中最大对齐数的整数倍,结构体的整体大小就是所有最大对齐 数的整数倍
有意思的是对齐数取的是较小值,整数倍取的是最大对齐数的整数倍
例题
通过对内存的分析,可以得到sizeof s4==32
存在原因
1.平台原因(移植原因):
不是所有硬件平台都能访问任意地址上的任意数据的
2.性能原因:
为了避免二次访问,防止访问对象被分放在两个内存块中了
总的来说,结构体的内存对齐是拿空间来换取时间的做法
那么如何尽可能的节省空间呢?
让占用空间小的成员尽量集中在一起
修改默认对齐数 #pragma
结构体传参
传址的优越性
结构体实现位段
内存分配
介绍:位段的成员名后面有一个冒号和一个数字,来自定义所占bite位
作用:节省空间
位段的内存分配
运行以下代码
1. vs是从右向左存的
2. 一个字节(因为是char) 剩余的空间,不足下一个成员使用,存在浪费
跨平台问题和应用
问题:
1.int 被当成有符号数还是无符号数不确定
和结构相比,位段可以达到同样的效果,还可以节省空间,但是有跨平台的问题存在
运用: //ip数据报
要将信息从A传到B,像快递一样需要打包,除了数据之外的其他的就相当于寄件信息
注意事项:
位段的几个成员共有同一个字节,内存中每个字节分配一个地址,字节内部的bite是没有地址的
所以1.不能对位段成员使用&操作符
2.不能使用scanf直接给位段成员输入值
正确示范:
int b=0;
scanf("%d",&b);
sa.b=b;
需要借助中间变量,不能直接 scanf("%d",&sa.b)
//看完有用的话,留下个赞再走叭~