结构体内存对齐 offsetof 枚举 联合体


在这里插入图片描述

结构体

在这里插入图片描述
在这里插入图片描述

结构体内存对齐

在这里插入图片描述

第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,
利用联合体巧妙判断计算机是大端字节序还是低端字节序
在这里插入图片描述
在这里插入图片描述

联合体大小的计算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
笔试题在84课有讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值