C语言⾃定义类型:联合和枚举

1.枚举类型

1.1枚举类型的声明

枚举顾名思义就是⼀⼀列举。
把可能的取值⼀⼀列举。
⽐如我们现实⽣活中:
⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
性别有:男、⼥、保密,也可以⼀⼀列举
⽉份有12个⽉,也可以⼀⼀列举
三原⾊,也是可以意义列举
这些数据的表⽰就可以使⽤枚举了。

1.2枚举的定义

我们使用代码来演示使用枚举来定义   星期和颜色

enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,       //大括号中放的是枚举的可能取值
Sat,
Sun
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};

以上定义的 enum Day ,, enum Color 都是枚举类型。
{ } 中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。 

 1.3枚举类型的优点

为什么使⽤枚举?
我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤ 。

1.4枚举类型的使⽤ 

enum Color//颜⾊
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN; //使⽤枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。 

 2.联合体

2.1 联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所
以联合体也叫:共⽤体。
给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

代码演示:

//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
//计算连个变量的⼤⼩
printf("%d\n", sizeof(un));
return 0;
}

这时大家肯定会有疑问,(char)1+(int)4=5  为什么程序输出的是4呢?

大家一定忽略了一点   联合体的特点是所有成员共⽤同⼀块内存空间   我们打印出它们的地址来看观察。

//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
printf("%p\n", &un);
printf("%p\n", &(un.c);
printf("%p\n", &(un.i);
return 0;
}

不难看出,地址都是同一块地址。

我们通过画图来展示,其中 绿色的是c所占据的内存而绿色的加上白色的一共四个字节都是 i 的。

我们来拓展一下判断机器的大小端。

int a=1;

得到地址 0x 00 00  01

如何判断是大端还是小端呢?

大端就是把高位地址放在高地址,把低位地址放在低地址。

小端就是把低位字节的地址放在低地址,高位字节放在高在高地址。

我们通过观察可以发现大端与小端的差别在于 前两个数字

01(小端)    00(大端)

代码展示:

我们通常是采取指针的形势,我们通过指针拿出前两个地址判断是否存在 1 若存在1则说明是小端。我们先来使用指针来为大家展示,稍后展示联合体的形势。

指针形式:

//判断当前机器是大端还是小端?
#include<stdio.h>
{ 
  int a=1; 
 if(*(char*)&a==1)  //强制类型转化为char*(目的是为了访问一个字节)
    return 1;
else
    return 0;
int main()
{
  int ret= check_sys();
  if(ret == 1)
     printf("小端\n")
  else
     printf("大端\n")
   return 0;
}

  

联合体形式:

int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c; //返回1是⼩端,返回0是⼤端
}

2.2联合体⼤⼩的计算 

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}

 

这是为什么呢?

我们先看第一个的最大对齐数是多少?很明显是int类型的4,4的整数倍8.

再看第二个最大对齐数还是4,至少需要14来存放,那么距离14最近的4的倍数就是16.

今天的内容到此结束

后续为大家更新动态内存管理

感谢你的观看

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值