文章目录
- 前言
- 一、枚举
-
- [1. 枚举类型的定义](#1. 枚举类型的定义)
- [2. 枚举的特点](#2. 枚举的特点)
- 二、联合(共用体)
-
- [1. 联合类型的定义](#1. 联合类型的定义)
- [2. 联合的特点](#2. 联合的特点)
- [3. 联合大小的计算](#3. 联合大小的计算)
- [4. 联合体判断大小端](#4. 联合体判断大小端)
-
- [1. 不适用联合体判断大小端](#1. 不适用联合体判断大小端)
- [2. 使用联合体判断大小端](#2. 使用联合体判断大小端)
- 总结
前言
C语言自定义类型枚举、枚举类型的定义、枚举的特点、以及自定义类型联合体、联合类型的定义、联合的特点、联合大小的计算、联合判断大小端 的介绍
一、枚举
顾名思义,枚举就是一一列举。
1. 枚举类型的定义
c
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
c
enum Sex
{
MALE,
FEMALE,
SECRET
};
c
enum Colr
{
RED,
GREEN,
BLUE
};
- 上述代码中, enum Day, enum Sex, enum Color 都是枚举类型。
- {} 中的内容是枚举类型的可能取值, 也叫 枚举常量。
- 这些可能取值都是有值的 ,默认从 0 开始, 一次递增 1。
- 在定义的时候可以赋初值:
- 若 只 赋予第一个枚举常量初值, 后面的常量会递增 1。
- 也可以给每个枚举常量都赋初值。
- 默认情况下枚举常量的值
c
#include <stdio.h>
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
int main()
{
printf("%d\n", Mon); // 0
printf("%d\n", Tues); // 1
printf("%d\n", Wed); // 2
printf("%d\n", Thur); // 3
printf("%d\n", Fri); // 4
printf("%d\n", Sat); // 5
printf("%d\n", Sun); // 6
return 0;
}
- 第一个枚举常量赋初值情况下的值
c
#include <stdio.h>
enum Day
{
Mon = 1,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
int main()
{
printf("%d\n", Mon); // 1
printf("%d\n", Tues); // 2
printf("%d\n", Wed); // 3
printf("%d\n", Thur); // 4
printf("%d\n", Fri); // 5
printf("%d\n", Sat); // 6
printf("%d\n", Sun); // 7
return 0;
}
- 每个枚举常量赋初值情况下的值
c
enum Colr
{
RED = 255,
GREEN = 0,
BLUE = 100
};
int main()
{
printf("%d\n", RED); // 255
printf("%d\n", GREEN); // 0
printf("%d\n", BLUE); // 100
return 0;
}
- 可以基于枚举常量创建枚举类型的变量来存储常量。
c
#include <stdio.h>
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
int main()
{
enum Day d = Fri;
printf("%d\n", d); // 4
return 0;
}
2. 枚举的特点
1. 增加代码的可读性和可维护性
2. 和 #define 定义的标识符比较,枚举有类型检查, 更加严谨
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
- 枚举增加类型的检查,在 c 语言中体现不明显, 比如在 c++ 中的如下赋值:
所以,只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
二、联合(共用体)
1. 联合类型的定义
联合也是一种特殊的自定义类型
- 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)。
c
union Un
{
char c;
int n;
};
- union 是联合的关键词
- Un 是 联合的标签名
2. 联合的特点
联合的成员是公用同一块内存空间,这样一个联合变量的大小,至少是最大成员的大小,(因为联合至少得有能力保存最大的那个成员)。
联合的成员不同时使用
c
union Un
{
char c;
int n;
};
int main()
{
union Un u;
printf("%p\n", &u); // 000000B816AFFC64
printf("%p\n", &u.c); // 000000B816AFFC64
printf("%p\n", &u.n); // 000000B816AFFC64
}
3. 联合大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
c
#include <stdio.h>
union Un
{
char c;
int n;
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));// 4
}
c
#include <stdio.h
union U1
{
char arr[5];
int n;
};
int main()
{
union U1 u1;
printf("%d\n", sizeof(u1)); // 8
}
4. 联合体判断大小端
1. 不适用联合体判断大小端
c
int check_sys(int a)
{
return *(char*)&a; // 1
}
int main()
{
int a = 1;
if (1 == check_sys(a))
printf("小端\n");
else
printf("大端\n");
return 0;
}
2. 使用联合体判断大小端
c
union Un
{
char c;
int n;
}u;
int main()
{
u.n = 1;
if (1 == u.c)
printf("小端\n"); // 小端
else
printf("大端\n");
return 0;
}
总结
C语言自定义类型枚举、枚举类型的定义、枚举的特点、以及自定义类型联合体、联合类型的定义、联合的特点、联合大小的计算、联合判断大小端 的介绍