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语言自定义类型枚举、枚举类型的定义、枚举的特点、以及自定义类型联合体、联合类型的定义、联合的特点、联合大小的计算、联合判断大小端 的介绍

相关推荐
互联网打工人no11 分钟前
每日一题——第一百二十一题
c语言
朱一头zcy1 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>4 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
EricWang13586 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??6 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
希言JY7 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
午言若7 小时前
C语言比较两个字符串是否相同
c语言