【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

结语

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

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


相关文章
|
29天前
|
存储 安全 C语言
C语言中的数据类型
C语言中的数据类型
|
3天前
|
存储 C语言 索引
C 语言数据类型详解
C语言中的数据类型主要包括基本数据类型、构造数据类型和用户定义数据类型。基本类型如整型(`int`)、字符型(`char`)、浮点型(`float`)、双精度浮点型(`double`)和无符号整型(`unsigned int`)。构造类型包括数组(`Array`)、结构体(`Struct`)、共用体(`Union`)和枚举(`Enum`)。用户定义类型则通过`typedef`为已有类型定义新名称,并可通过结构体和共用体自定义复合数据结构。此外,还有指针类型用于存储变量地址,以及`signed`、`unsigned`、`short`、`long`等类型修饰符。
22 11
|
2天前
|
存储 C语言
【C语言基础考研向】02 数据类型-常量-变量
本文介绍了编程中的基本概念,包括数据类型分类、常量与变量的定义及使用。首先概述了四大类数据类型:基本类型(整型、浮点、字符型)、构造类型(数组、结构体)、指针类型和空类型。接着阐述了常量与变量的区别及命名规则,并详细说明了整型、浮点型和字符型数据的特点与应用。最后总结了常见的易错点,如字符串与字符常量的区别及浮点数的默认输出格式。
|
4天前
|
存储 编译器 程序员
c语言基本数据类型详解
在 C 语言中,基本数据类型用于存储不同类型的数据,并在内存中分配不同大小的空间,如 `char`(1 字节)、`int`(4 字节)、`short`(2 字节)、`long`(4 或 8 字节)、`float`(4 字节)和 `double`(8 字节)。此外,还有 `void` 和用 `int` 类型替代的 `bool` 类型。这些数据类型的存储空间大小可能因编译器和平台的不同而有所变化,但通常遵循上述规则。选择合适的数据类型可以充分利用内存空间并确保数据准确性。C 语言还支持用户自定义数据类型,如结构体和枚举类型,用于描述复杂的数据结构。
|
5天前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
10天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
26天前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
|
26天前
|
存储 编译器 C语言
【C语言篇】C语言数据类型和变量
我们使⽤强制类型转换都是万不得已的时候使用,如果不需要强制类型转化就能实现代码,这样⾃然更好的.
|
C语言
《C语言及程序设计》实践项目——枚举应用
返回:贺老师课程教学链接 【项目1-对称点】 设计函数,可以按指定的方式,输出一个平面点的对称点 下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。 #include<stdio.h> enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void
1085 0
|
2天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。