当前位置: 首页 > news >正文

联合体和枚举——— 自定义类型

联合体:

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

联合体的声名:

union Un//联合类型的声明
{
  char c;//联合体成员
  int i;
};

union Un un;//联合变量的定义

注意: 联合体的成员共用同一块内存空间,这样一个联合体变量的大小至少是最大成员的大小(因为联合体至少得有那个能力去保存最大的那个成员)。
联合体大小的计算:

  • 联合的大小至少是最大成员的大小。
  • 当前最大成员不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。
#include<stdio.h>

union Un2
{
        char c[5];

        int i;
};

union Un3
{
        short c[7];

        int i;
};

int main()

{
       printf("%d\n", sizeof(union Un2));//8
   //结果是5,不是最大对齐数4的整数倍,补3
       printf("%d\n", sizeof(union Un3));//16
 //结果是12,不是最大对齐数4的整数倍,补2
       system("pause");
       return 0;
}

联合体的运用:
利用联合体的性质来判断计算机存储的大小端存储模式。

#include<stdio.h>

union Un 
{
   char c;
   int i;
};

int main()
{
   union Un un;
   un.i=1;
   if(un.c==1)
   {
      printf("小端存储模式\n";
   }
   else
   {
      printf("大端存储模式\n";
   }
    system("pause");
    return 0;
}

枚举

一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
枚举的声名和枚举变量的赋值:

enum Num//枚举类型 Num枚举名
{

    x1=-2,
    x2,
    x3=50,
    x4
}x;//枚举变量

int main()
{
	enum Num a,b,c,d;//枚举变量
	a = x1; //-2
	b = x2; //-1
	c = x3; //50
	d = x4; //21
	printf("%d\n%d\n%d\n%d\n", a, b, c, d);
	system("pause");
	return 0;
}

注意:

  • 如果枚举没有初始化,即省掉"=整型常数"时, 则从第一个标识符开始,顺次赋给标识符0, 1, 2, …。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。
  • 枚举中每个成员(标识符)结束符是"," 不是";", 最后一个成员可省略","。
  • 初始化时可以赋负数, 以后的标识符仍依次加1。
  • 枚举变量只能取枚举说明结构中的某个标识符常量。
  • .枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
  • 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
    枚举的优点:
  • 增加代码的可读性和可维护性。
  • 和#define定义的标识符比较枚举有类型检查,严谨。
  • 防止了命名污染(封装)。
  • 便于调试。
  • 使用方便,一次定义多个常量。

相关文章:

  • 结构体通讯录——C语言知识运用
  • 编译和宏的理解
  • 时间空间复杂度——详解
  • 【数据结构:队列】——队列的实现(C语言)
  • 【数据结构:栈】——栈的实现(C语言)
  • 【数据结构:链表】——无头单向非循环链表的实现(C语言)
  • 【数据结构:链表】——带头双向循环链表的实现(C语言)
  • 【数据结构:堆】——堆及堆的相关操作(C语言)
  • c++入门——基础知识点(1)
  • c/c++内存管理
  • 函数模板、类模板初识
  • 【Linux】进程地址空间了解
  • 【Linux】入门基础命令(1)
  • c++入门——基础知识点(2)
  • 【Linux】基础文件的I/O操作(1)
  • 《深入 React 技术栈》
  • CSS 三角实现
  • css系列之关于字体的事
  • Elasticsearch 参考指南(升级前重新索引)
  • java第三方包学习之lombok
  • LeetCode18.四数之和 JavaScript
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • nfs客户端进程变D,延伸linux的lock
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vim 折腾记
  • vue 配置sass、scss全局变量
  • 聊聊redis的数据结构的应用
  • 前端知识点整理(待续)
  • 让你的分享飞起来——极光推出社会化分享组件
  • 小程序开发中的那些坑
  • Hibernate主键生成策略及选择
  • # C++之functional库用法整理
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (floyd+补集) poj 3275
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm码农论坛 毕业设计 231126
  • (转)3D模板阴影原理
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .net Application的目录
  • .NET CORE Aws S3 使用
  • .pyc文件是什么?
  • /etc/sudoers (root权限管理)
  • [20170713] 无法访问SQL Server
  • [51nod1610]路径计数
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [codevs1288] 埃及分数
  • [Docker]十.Docker Swarm讲解
  • [Everyday Mathematics]20150130
  • [IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
  • [leetcode] 3Sum
  • [LitCTF 2023]Http pro max plus
  • [MongoDB]------windos下的安装部署与基础使用
  • [Nginx]反向代理Node将3000端口访问转换成80端口