C语言学习系列->联合体and枚举

简介: C语言学习系列->联合体and枚举

前言

在上一篇文章中,小编将结构体的学习笔记整理出来了。现在,小编将枚举和联合体笔记分享给大家。枚举和联合体与结构体一样,都是自定义类型,在学习完枚举和联合体后,C语言中自定义类型也就告一段落啦。

联合体

概述

联合体也是自定义类型,关键字为union,特点是所有成员共⽤同⼀块内存空间,因此,联合体也叫做共用体。

声明

union U
{
  char c;
  char i;
};

code

#include<stdio.h>
union U
{
  char c;
  int i;
};
int main()
{
  union U u = { 0 };
  printf("%d\n", sizeof(u));
  return 0;
}

联合体的特点

code

#include<stdio.h>
union U
{
  char c;
  int i;
};
int main()
{
  union U u = { 0 };
  printf("%d\n", sizeof(u));
  printf("%p\n", &u);
  printf("%p\n", &(u.i));
  printf("%p\n", &(u.c));
  return 0;
}

运行结果

4
008FFADC
008FFADC
008FFADC

分析

i和共用了一个空间,没有给i单独开一个空间,也没有给c单独开一个空间。

因此,这个叫做联合体(共用体)。

编译器只为最⼤的成员分配⾜够的内存空间,起码得保证最大的有空间容下。


code

#include <stdio.h>
//联合类型的声明
union Un
{
  char c;
  int i;
};
int main()
{
  //联合变量的定义
  union Un un = { 0 };
  un.i = 0x11223344;
  un.c = 0x55;
  printf("%x\n", un.i);
  return 0;
}

运行结果

11223355

分析


联合体大小的计算

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。

• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

code

#include <stdio.h>
union Un1
{
  char c[5];
  int i;
};
union Un2
{
  short c[7];
  int i;
};
int main()
{
  printf("%d\n", sizeof(union Un1));
  printf("%d\n", sizeof(union Un2));
  return 0;
}

运行结果

8
16

分析

对Un1:

这里,我们第一反应可能认为大小为5,因为c的字节是最大的,为5。

但是我们忽略可第二个规则“当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。”

这里的c数组是char型,自身大小是1,vs默认对齐数是8,故数组c的大小为1

i是int型,vs默认对齐数是8,故i的大小是4

联合的最大对齐数是4,最大成员是5,显然5不是4的倍数

5后面只有8是4的倍数

因此,输出结果为8


对Un2:

一个short类型是2个字节,现在有7个,那么一共14个字节

联合体中最大成员是14,最大对齐数是4,显然14不是4的倍数

14后面6是4的倍数

因此,输出结果为16

总结:

联合体大小不是最大成员的大小

优点

使用联合体可以节省一定的空间

HAUE某学院学生会需举办活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。

每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

图书:书名、作者、页数

图书:书名、作者、页数

杯子:设计

杯子:设计

衬衫:设计、可选颜色、可选尺寸

衬衫:设计、可选颜色、可选尺寸

结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的。

使用联合体:

struct gift_list
{
  int stock_number;//库存量
  double price; //定价
  int item_type;//商品类型
  union {
    struct
    {
      char title[20];//书名
      char author[20];//作者
      int num_pages;//⻚数
    }book;
    struct
    {
      char design[30];//设计
    }mug;
    struct
    {
      char design[30];//设计
      int colors;//颜⾊
      int sizes;//尺⼨
    }shirt;
  }item;
};

虽然写起来有点麻烦,但是节省了一定的空间

练习

用联合体写⼀个程序,判断当前机器是⼤端?还是⼩端?

union Un
{
  char c;
  int i;
};
int main()
{
  union Un un;
  un.i = 1;
  if (un.c == 1)
  {
    printf("小端\n");
  }
  else
  {
    printf("大端\n");
  }
  return 0;
}

枚举

概述

枚举,顾名思义,列举

将有限个,一 一列举出来,这就是枚举类型

声明

enum Day//星期
{
  Mon,
  Tues,
  Wed,
  Thur,
  Fri,
  Sat,
  Sun
};
enum Sex//性别
{
  MALE,
  FEMALE,
  SECRET
};

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Sex//性别
{
  MALE=3,
  FEMALE=5,
  SECRET=7
};

优点

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使⽤⽅便,⼀次可以定义多个常量
  5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

使用

enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;//避免这样写

可以拿整数给枚举变量赋值呢?

在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。


目录
相关文章
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
51 19
|
1月前
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
49 4
|
4月前
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
49 4
|
4月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
4月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
27 0
|
4月前
|
存储 编译器 Linux
深入理解 C 语言中的联合体
深入理解 C 语言中的联合体
|
4月前
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
4月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
6月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
62 1

热门文章

最新文章