C语言自定义类型枚举、枚举类型的定义、枚举的特点、以及自定义类型联合体、联合类型的定义、联合的特点、联合大小的计算、联合判断大小端 的介绍

文章目录

  • 前言
  • 一、枚举
    • [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。
  • 也可以给每个枚举常量都赋初值
  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;
}
  1. 第一个枚举常量赋初值情况下的值
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;
}
  1. 每个枚举常量赋初值情况下的值
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语言自定义类型枚举、枚举类型的定义、枚举的特点、以及自定义类型联合体、联合类型的定义、联合的特点、联合大小的计算、联合判断大小端 的介绍

相关推荐
落幕9 小时前
C语言-构造数据类型
c语言·开发语言
练小杰9 小时前
Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
linux·c语言·c++·经验分享·qt·学习·编辑器
人才程序员11 小时前
【C++拓展】vs2022使用SQlite3
c语言·开发语言·数据库·c++·qt·ui·sqlite
OKkankan11 小时前
实现二叉树_堆
c语言·数据结构·c++·算法
励志的小陈12 小时前
C语言-----扫雷游戏
c语言·开发语言·游戏
byte轻骑兵14 小时前
【0x0012】HCI_Delete_Stored_Link_Key命令详解
c语言·蓝牙·通信协议·hci
池央16 小时前
C语言数组详解:从基础到进阶的全面解析
c语言
2401_8437852318 小时前
C语言 指针_野指针 指针运算
c语言·开发语言
涅槃寂雨19 小时前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
『往事』&白驹过隙;19 小时前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统