c语言分层理解(枚举和联合体)

简介: 1. 枚举1.1 枚举定义枚举的意思就是列举。列举的是可能取值。

1. 枚举

1.1 枚举定义

枚举的意思就是列举。列举的是可能取值。

比如:

enum color
{
  red,
  bule,
  green,
  black,
  white
};

其结构和结构体相似:

bfa42c5f057fb8752467a006a2d31678.png

1.2 枚举常量的理解

1af03fcd18acf047a4f134e6ec4e60ef.png

特点:

默认的第一个常量是0,后面一次递增。赋值操作只能在枚举类型中赋值,可以理解为创建的时候给一个对应的值,但是为什么在主函数或者其他地方不能赋值呢?可以这么理解,在创建这个枚举的时候常量对应的有相应的数字,这里更改默认,使其改变,达到我们想要的目的,但是别处不能更改是因为这里我们已经定义好了我们想要的东西,它是个常量,常量是不能被修改的,但是你会回头问为什么开始可以去改变呢?因为我们需要达到某种目的,你也可以理解是语法固定。

1.3 枚举的优点

我们可以#define去定义常量为什么还需要枚举呢?

优点:

1.增强代码可读性和维护性

2.#define定义的标识符是没有类型的就是一个常量,枚举定义的常量是有类型的

3.防止命名污染

4.便于调试

5.使用方便,一次可以定义多个常量

枚举注意要点(枚举变量是有类型的):

2450a6c0494871108f7b809954f866d3.png

1.4 枚举大小

enum color
{
  red,
  bule,
  green,
  black,
  white
};
int main()
{
  printf("%d\n", sizeof(enum color));
  return 0;
}
//结果是4

解释:因为我们枚举列举的是可能要使用的值,而在我们使用时候只会拿到一个,又因为{}内是常量所以就是4个字节的大小。

1.5 枚举变量的使用

enum operation
{
  Exit,
  Add,
  Delete,
  Choose
};
int main()
{
  int input = 0;
  scanf("%d", &input);
  switch (input)
  {
  case Add:
    //实现操作
  case Delete:
    //实现操作
  case Choose:
    //实现操作
  case Exit:
    //实现操作
  }
}

好处就是通过名可以知道要实现什么操作。

2.联合体(共同体)

2.1 联合体定义

联合体顾名思义就是公用一块空间。

形式(和结构体形式一样):

union Un
{
  int a;
  char c;
  float f;
};

1.2 联合体特点

看图得知:

f9cd6ce571ff0fd45a3641f712a93d43.png


共用同一个空间的起始地址。

1.2.1 联合体实现判断大小端

方法一:

int check_sys()
{
  //1=0x01000000;
  int num = 1;
  return *(char*)#
}
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;
}

1.3 联合体的大小

联合的大小至少是最大成员的大小

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

1.3.1 实例一

5b4bf10e82b4d8addbf473b9b542b623.png

1.3.2 实例二

07a3c98cff4d3bb44e140d191525a278.png









相关文章
|
27天前
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
28 4
|
27天前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
存储 编译器 Linux
深入理解 C 语言中的联合体
深入理解 C 语言中的联合体
|
1月前
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
1月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
3月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
43 1
|
5月前
|
C语言
枚举(C语言)
枚举(C语言)
|
5月前
|
编译器 C语言
C语言枚举:深入探索下标默认值、自定义值及部分自定义情况
C语言枚举:深入探索下标默认值、自定义值及部分自定义情况
|
5月前
|
存储 编译器 C语言
C语言的联合体:一种节省内存的数据结构
C语言的联合体:一种节省内存的数据结构
|
5月前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
36 0