文章目录
- 结构体
- 结构体内存对齐
- 结构体嵌套结构体
- 内存对齐的原因
- 修改默认对齐数
- 设置默认对齐数 #pragma pack()
- offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。
- 结构体传参
- 值传递
- 地址传递
- 位段
- 枚举
- 联合 联合体 共用体
- 联合体大小的计算
结构体
结构体内存对齐
第2条中, gcc编译器没有默认的对齐数,那对齐数就是该成员的大小
对于数组算对齐数的时候,算的是元素的对齐数【第二条中的其它成员变量如果是数组,那么该成员变量的大小是看数组的类型,而不是数组类型*数组元素的个数】
第4条最大对齐数(即所有对齐数中最大的那个),嵌套结构体的对齐数
是嵌套的结构体最大的对齐数
嵌套结构体从哪开始放?嵌套结构体对齐到自己最大对齐数的整数倍处
嵌套结构体占几个字节,按照结构体结构体对齐规则算就好喽
结构体嵌套结构体
结果为32
struct S {
char a;//1
int c;//4
char b[0];//变长数组,不占结构体的大小。变长数组(柔长数组)只能放在最后
};
int main()
{
printf("%d\n", sizeof(struct S));// 输出8
system("pause");
return 0;
}
内存对齐的原因
第一条是指比如整型只能在4的倍数处取,这只是假设方便理解
修改默认对齐数
设置默认对齐数 #pragma pack()
offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。
结构体传参
值传递
char a = 0; ‘\0’ a是空字符
地址传递
不想对里面的内容做修改
结论: 结构体传参要传结构体地址
位段
内存以16进制来展示的
枚举
联合 联合体 共用体
p61 22:57
因为共用同一块空间用c的时候就不能用i,
利用联合体巧妙判断计算机是大端字节序还是低端字节序
联合体大小的计算