【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

结语

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

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


相关文章
|
27天前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
36 1
|
1月前
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
28 4
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
C语言
3.4 C语言基本数据类型2
在C语言中,声明一个整型(int)变量时,需先写入'int'关键字,后跟变量名并以分号结尾。若同时声明多个变量,可在'int'后用逗号分隔列出所有变量名。例如,`int erns;` 或 `int hogs, cows, goats;` 都是合法声明。变量声明后需通过赋值语句如 `cows = 112;` 或使用函数如 `scanf()` 来初始化其值。
44 10
|
1月前
|
存储 程序员 C语言
3.1 C语言基本数据类型
在C语言中,整数类型如`int`类型是很有用的,它属于有符号整型,意味着该类型的值必须是整数,并且可以是正整数、负整数或者零。`int`类型的数值范围依据计算机系统有所不同,通常取决于系统的位宽。例如,在早期16位的IBM PC兼容机上,`int`类型使用16位存储,取值范围为-32768至32767;而在当前32位系统中,使用32位存储,拥有更宽泛的取值范围。随着64位处理器的普及,`int`类型能够存储的整数范围将进一步扩大。根据ISO C标准,`int`类型的最小取值范围被规定为-32768到32767。系统通常会利用一个特殊的位来表示整数的正负。
34 10
|
1月前
|
C语言
3.1C语言基本数据类型
在C语言中,初始化变量是指为变量设定初始值,通常在声明时直接完成,例如 `int cows=32;`。应注意避免在同一语句中混合初始化与未初始化的变量,如 `int dogs, cats=94;` 这样的写法容易引起误解。此外,整型常量如21、32等在C语言中被视为int类型,但非常大的整数则不然,且带有小数点或指数的数值不属于整型常量。
27 9
|
1月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
1月前
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
1月前
|
存储 编译器 程序员
C语言数据类型详解
C语言数据类型详解
|
1月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述