联合体和枚举

简介: 联合体和枚举

1.联合体

联合体和结构体一样也有自己的成员,成员可以是不同类型,但是编译器只为最大的成员分配空间。

联合体的特点就是所有成员共用一块空间,也就是说给其中一个成员赋值,其他成员的值也随之改变,所以也叫:共用体。


1.1联合体的类型和声明
#include <stdio.h>
//联合类型的声明
union Un
{
 char c;
 int i;
};
int main()
{
 //联合变量的定义
 union Un un = {0};
 //计算两个变量的⼤⼩
 printf("%d\n", sizeof(un));
 return 0;
}


结果是:4

也就是最大成员int的大小。


1.2联合体的特点

联合体的大小是最大成员的大小,因为联合体至少得有能力保存最大成员。

联合体中的所有成员的地址相同:

#include <stdio.h>
//联合类型的声明
union Un
{
 char c;
 int i;
};
int main()
{
 //联合变量的定义
 union Un un = {0};
 // 下⾯输出的结果是⼀样的吗?
 printf("%p\n", &(un.i));
 printf("%p\n", &(un.c));
 printf("%p\n", &un);
 return 0;
}


输出结果:

001AF85C
001AF85C
001AF85C


联合体中的一个成员改变,其他成员也随之改变:

//代码2
#include <stdio.h>
//联合类型的声明
union Un
{
 char c;
 int i;
};
int main()
{
 //联合变量的定义
 union Un un = {0};
 un.i = 0x11223344;
 un.c = 0x55;
 printf("%x\n", un.i);
 return 0;
}


输出结果:

11223355

原因:这是因为每个成员共同使用一块空间,当我们给整型赋值为了0x11223344时,char类型的c的值就是0x44,此时改变c为0x55,也就是改变了i的最后一个字节变成0x11223355

17ccb0f9bf88423c874938d4d5d084dc.png

1.3联合体的大小计算

联合体的大小最少是最大成员的大小;

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


1.4联合体判断大小端
int check_sys()
{
 union
 {
 int i;
 char c;
 }un;
 un.i = 1;
 return un.c;//返回1是⼩端,返回0是⼤端
}


2.枚举

枚举,顾名思义,也就是一一例举,如:

⼀周的星期⼀到星期日是有限的7天

性别有:男、女、保密

这些数据的表示就可以使用枚举了


2.1枚举的类型和声明
enum Day//星期
{
 Mon,//值为0
 Tues,//值为1
 Wed,//...
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};
enum Color//颜⾊
{
 RED,
 GREEN,
 BLUE
};


其中的enum Day enum Sex enum Color 都是枚举类型。

{}里面的成员就叫枚举常量。

它们都是有值的,默认是从0开始,下面以此类推,1,2,3,4...

当然在声明枚举类型的时候也可以赋初值。

enum Color//颜⾊
{
 RED=2,
 GREEN=4,
 BLUE=8
};


2.2枚举的优点

可以使用 #define 定义常量,为什么非要使用枚举?

1. 增加代码的可读性和可维护性

2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

3. 便于调试,预处理阶段会删除 #define 定义的符号

4. 使用方便 ⼀次可以定义多个常量

5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

目录
相关文章
|
1月前
|
存储 C语言
自定义类型:联合体和枚举
联合体类型,联合体的大小计算,联合体的实际应用,练习:判断大小端,枚举类型,枚举类型的声明:枚举类型的优点,枚举类型的实际案例:
|
4天前
|
存储 算法
枚举类型和联合体类型
枚举类型和联合体类型
7 0
|
19天前
|
存储 编译器 Linux
自定义类型——结构体、联合体、枚举
自定义类型——结构体、联合体、枚举
20 1
|
30天前
|
存储
【自定义类型详解】完结篇—联合体(共用体)与枚举详解
【自定义类型详解】完结篇—联合体(共用体)与枚举详解
17 0
|
1月前
|
编译器 测试技术 C语言
详解自定义类型:枚举与联合体!
详解自定义类型:枚举与联合体!
|
10月前
|
C语言
C语言知识点:结构体,枚举,联合体
C语言知识点:结构体,枚举,联合体
53 0
|
1月前
|
存储 开发框架 .NET
自定义类型:联合体和枚举类型(联合体与结构体的区别)
自定义类型:联合体和枚举类型(联合体与结构体的区别)
|
6月前
|
编译器 C++
结构体、枚举、位段、联合体详解
结构体、枚举、位段、联合体详解
51 0
|
8月前
|
存储 编译器 C语言
C/C++之自定义类型(结构体,位段,联合体,枚举)详解
C/C++之自定义类型(结构体,位段,联合体,枚举)详解
54 0
|
10月前
|
存储 C语言
自定义类型——位段,枚举,共用体(联合体)
✅<1>主页:C语言的前男友 📃<2>知识讲解:结构体,声明,变量初始化,结构体内存对齐 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:今天继续把剩下的自定义类型拉出来说一说。
自定义类型——位段,枚举,共用体(联合体)

热门文章

最新文章