【C语言】自定义数据类型:枚举+共用体

简介: 【C语言】自定义数据类型:枚举+共用体

前言

之前我们学习了自定义数据类型里的结构体,还顺带着学习了位段

今天,我们就来学习枚举和共用体,我们开始吧

自定义类型:结构体

位段详解

枚举

枚举就是一一列举

枚举类型的定义

枚举类型的创建

enum Day
{
  mon,//此处是逗号
  tues,
  thur,
};//;不能少

enum:是类型关键字

{}里的就是可能的取值,都是常量

第一个常量的值默认是0,之后挨个增加

初始值可以改变,当不改变时就认为是前一个常量的值加一

下面给出三个例子方便大家理解

1
enum Day
{
  mon,
  tues,
  thur,
};
int main()
{
  enum Day d1 = mon;
  printf("%d %d %d\n", mon, tues, thur);
  return 0;
}

运行结果:

2
enum Day
{
  mon = 1,
  tues = 3,
  thur = 5,
};
int main()
{
  enum Day d1 = mon;
  printf("%d %d %d\n", mon, tues, thur);
  return 0;
}

运行结果:

3
enum Day
{
  mon,
  tues = 3,
  thur,
};
int main()
{
  enum Day d1 = mon;
  printf("%d %d %d\n", mon, tues, thur);
  return 0;

运行结果:

枚举类型的使用

enum Day
{
  mon,
  tues,
  thur,
};
int main()
{
  enum Day d1 = mon;
  return 0;
}

创建变量需要写上关键字,并且变量的值只能是定义中的某一个值

注意

不要给枚举常量赋值,这是错误的

enum Day d2 = 4;

枚举类型的大小

我们用一段代码来解释这个问题:

enum Day
{
  mon,
  tues,
  thur,
};
int main()
{
  enum Day d1 = mon;
  printf("%zd\n", sizeof(d1));
  return 0;
}

运行结果:

原因

因为上文提到了,mon这些成员的值默认是整数,都是int类型

所以我们可以知道他们的大小都是4个byte

注意

枚举类型的值是不可改变的,是由编译器决定的,所以大小就是固定的4byte

枚举的优点

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

联合(共用体/联合体)

联合的定义

union Un
{
  char c;
  int i;
};
int main()
{
  union Un u;
  return 0;
}

union是联合关键字

联合的特点

先来看一段代码,下面代码的结果是什么

union Un
{
  char c;
  int i;
};
int main()
{
  union Un u;
  printf("%zd\n", sizeof(u));
  printf("%p\n", &u);
  printf("%p\n", &(u.i));
  printf("%p\n", &(u.c));
  return 0;
}

运行结果:

能看出来,他们的地址是相同的,也就是说他们都从同一块空间开始存储、占用同一块空间,这就是共用体的名称来源

所以联合体至少是最大成员的大小,在上面这道题中,就是4

提示

因为成员都从同一块空间存储,所以不能同时使用

联合体的使用

引入

先看一道笔试题:

判断当前机器的大小端存储(字节存放顺序)

使用指针
int check_sys()
{
  int a = 1;
  return *(char*)&a;
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
  {
    printf("小\n");
  }
  else
  {
    printf("大\n");
  }
  return 0;
}
使用联合体
int check_sys()
{
  union Un
  {
    char c;
    int i;
  }u;//此处可以像结构体一样,创建一个全局的联合体变量
  u.i = 1;
  return u.c;//返回的是第一个字节
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
  {
    printf("小\n");
  }
  else
  {
    printf("大\n");
  }
  return 0;
}

联合体的大小

下面这段代码的运行结果是:

union Un
{
  int a;
  char arr[5];
};
int main()
{
  union Un u;
  printf("%zd\n", sizeof(u));
  return 0;
}

计算联合体大小的规则

联合体的大小至少是最大成员的大小(类似结构体)

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

数组的对齐数:用其中一个元素的大小来和默认值比较

由上可知,4+1+3 == 8,结果是8

结语

自定义数据类型的知识介绍到这里就结束了,感觉收获很多呢

之后我利用已经学会的知识来尝试去实现通讯录,我们下篇文章见~


相关文章
|
10月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
8月前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
912 1
一文彻底搞清楚C语言的数据类型和变量
|
9月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
129 19
|
9月前
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
178 4
|
9月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
229 1
|
10月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
426 8
|
12月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
207 1
|
12月前
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
118 4
|
12月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
125 0
深入C语言,发现多样的数据之枚举和联合体
|
12月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
109 0