C语言自定义类型(个人笔记)

本文详细解释了C/C++中的结构体内存对齐规则,包括VS和gcc环境下的差异,位段的声明和内存分配,枚举的优点,以及如何实现通讯录并利用联合体进行大小端判断。
摘要由CSDN通过智能技术生成

结构体的内存对齐

规则:
1.结构体的第一个成员永远都放在0偏移量处

2.从第二个成员开始,以后的每个成员都要对齐到某个对齐数的整数倍处
这个对齐数是:成员自身大小和默认对齐数的较小值
备注:
VS环境下 默认对齐数是8
gcc环境下 没有默认对齐数,没有默认对齐数时,对齐数就是成员自身的大小

3.当成员全部存放进去后
结构体的总大小必须是,所有成员的对齐数中最大对齐数的整数倍.
如果不够,则浪费空间进行对齐.

4.如果嵌套了结构体,嵌套的结构体成员要对齐到自己成员的最大对齐数的整数倍处.
整个结构体的大小,必须是最大对齐数的整数倍,最大对齐数包含嵌套的结构体成员中的对齐数

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

修改默认对齐数
#pragma pack(8)//设置默认对齐数为8
#pragma pack()//取消设置的默认对齐数,还原为默认

位段

位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。

位段的内存分配

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

在这里插入图片描述

枚举

枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

通讯录

实现一个通讯录:
1.可以存放100个人的信息
2.每个人的信息:
名字,性别,年龄,电话,地址
3.增加联系人
4.删除联系人
5.查找指定联系人
6.修改指定联系人
7.显示联系人信息
8.排序联系人(按照年龄/名字)

联合体

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间

特点:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)

计算:
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

在这里插入图片描述
使用联合体判断大小端

union Un
{
    char c;
    int i;
};
int main()
{
    union Un u;
    u.i=1;
    if(u.c==1)
    {
        printf("小端");
    }
    else
    {
        printf("大端");
    }
    return 0;
}
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

索隆43

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值