自定义类型(结构体,位段,枚举,联合)

自定义类型有:结构体,枚举,联合

一、结构体

1.声明

struct Stu

{
     char name[20];//名字
     int age;//年龄
     char sex[5];//性别
     char id[20];//学号

 };

分号不能丢

2.特殊的声明

//匿名结构体类型

struct 
{
   int a;
   char b;
   float c;

}x;

struct 
{
   int a;
   char b;
   float c;
   a[20];
}*p;

此时 p = &x; 是非法的

3.结构体的自引用

struct Node
{
    int data;
    struct Node* next; 
};

自引用应先定义完整的结构体,再进行引用

结构体可以嵌套

4.结构体的内存对齐

1.第一个成员的地址从0开始

2.其他成员要对应到自身大小整数倍的位置,如int 要对应 4或者8

3.结构体总大小要为最大对齐数的整数倍,如结构体大小计算为18,最大对齐数为int,4个字节,那么结构体的大小为20

4.嵌套的结构体对齐数为最大对齐数的整数倍,包含结构体的结构体对齐数是所有对齐数中最大的,结构体的整体大小也是其整数倍

5.内存对齐访问更快,是拿空间换时间

6.设计结构体时,应将对齐数小的放到前面(所占字节小),可以节省空间

7.修改默认对齐数

#pragma pack(8) //设置默认对齐数为8

struct S1
{ 
    char c1;
    int i;
    char c2; 
};

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

5.结构体传参

void print1(struct S s)

void print2(struct S* ps)

有两种传参方式,最好选择print2函数,要传结构体的地址,选择print1函数时,传参时会压栈,导致系统性能下降

二、位段

struct S 
{   
     char a:3;
     char b:4;
     char c:5;
     char d:4; 
};

注意此处冒号,冒号后的数字即该变量所占空间的大小(比特位)

不建议跨平台使用

三、枚举

enum Color//颜色
{ 
   RED,
   GREEN,
   BLUE 
};

enum Color为枚举类型,{ }内为枚举变量,这些变量都是由值的,从0开始,依次递增1

也可以对它们进行赋值,赋值一个变量后,其后边的变量依次递增1

四、联合体(共用体)

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小

(因为联 合至少得有能力保存最大的那个成员)

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un2
{ 
   short c[7];
   int i; 
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天王级选手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值