=================目录=====================
=====================================
一.结构体
1.结构体大小
①若没有位段:先找默认对齐数和每个数的较小值,再在这些较小值中找出最大的,即为最大对齐数.若上个对齐数开辟的空间还有冗余可以放下下个数,就把下个数也放在这个空间内,如果不够放下下个数,就把下个数放到下个空间内.(当结构体中有结构体时,计算结构体大小时,结构体里的结构体单独计算,最后其大小加在外层结构体的大小上)
②若有位段:看各位段开辟的空间大小,能不能放下下个数.
2.结构体的定义
struct Stu s{
score;
};
3.结构体的引用
①.和->的区别
(*a).b 等价于 a->b
结构体名.要引用的属性名 == 读取该结构体中要引用属性
结构体指针->要引用的属性名 == 读取该结构体中要引用属性
(结构体指针指向结构体)
②结构体的引用
struct Stu s{
int x;
int y;
};
int main() {
struct Point s = {
3, 5 };
printf("%d %d", s.x, s.y);
return 0;
}
③结构体大小
VC编译器的默认最大对齐数为8
可以用#pragma pack(4)来重新初始化最大对齐数
用#pragma pack()来取消刚初始化的最大对齐数
壹.不存在位段
先取结构体中各数据的大小和默认最大对齐数比,其中的较小值为该数的最大对齐数
然后比较所有数据的最大对齐数,最大的为所求
然后将各个数据塞进所求的整数倍
- 当无结构体嵌套时,数据塞进所求的整数倍即可
- 当有结构体嵌套时,数据塞进所求的整数倍,并嵌套的结构体另独立计算,然后最后再看外层是否为所求的整数倍
贰.存在位段(位段不存在跨平台性)
结构体中位段的大小和对大对齐数无关,但和位段定义的数据类型有关
struct S