C语言自定义数据类型系列

2023.1.30

今天学习了结构体的对齐数,枚举,联合体,以下是个人总结的笔记:

结构体是有对齐数的VS编译器的对齐数是8,第一个成员不用看对齐数,直接从首个地址开始放置,int这个类型不是结构体第一个成员的话,就要对比对齐数,以比较小的那个数为对齐数,比方说8比较4,取较小值为当前成员的对比数,那么int的对齐数为4,由结构体首个内存地址
开始数,int放置的地址必须为首个地址的起数的第4个字节或者4个字节的倍数位置。

结构体的构造必须用struct语句定义结构,#pragma pack(n),设置对齐数的指令,其中n
为数字,可写4或8

offsetof()这是一个计算结构体偏移量的宏,头文件是stddef.h,这个宏可以传输类型

结构体可以实现内存空间的高效运用,这种运用手法叫位段
struct S
{
    //位段的分割
    int a : 2;//分割两个比特位
    int b : 5;//分割5个比特位
    int c : 10;
    int d : 30;
};
后期内部放入整型时是根据位段分割出来的内存空间放置的,以上例子共占八个字节,因int为四个字节类型,
能放下前三个成员,第四个放不下,所以又新建一个int放第四个,位段一般情况下都会统一类型定义,
和例子一样,定义类型要统一,位段根据类型增加内存空间,比方说类型为int,增加空间时每次增加一个int,也就是四个字节。

枚举类型,enum为类型名,定义类型,结构与结构体非常类似,但内部是定义常量的,比方说把
red=10,把red定义为10的常量定义类似于#define的常量定义,对比#define的常量,枚举的可读性更高,调试更方便

联合体类型,union为类型名,定义类型结构与结构体非常类似,但内部内存是共用的,例子如下:
    union un//联合体
    {
        char c;
        int i;//两个类型共用一个空间
    }u;//创建的全局变量
un的大小为四个字节,i和c是共用四个字节的,所以使用有一个条件,就是不能同时使用i和c,没次
只能使用其中一个,联合体的大小最少是最大成员的大小,当其中最大的成员大小容不下所有数据时,
就以最大成员大小的倍数增加内存,比方说内部最大成员是int,一个int四个字节放不完,就再增加
一个int也就是四个字节内存进行存储

(ps:我是一个C语言初学者,如果各位大佬看到我总结的有错误,请多多指点,我会有则改之无则加勉,谢谢)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值