C语言共用体union作用使用示例教程

目录
  • 共用体 union
  • 开锅解构
  • 小结一手

共用体 union

什么是共用体 union?这个共用体,估计大家平时在代码也比较少见,我去看了;其实这个共用体 union(也叫联合体)跟结构体定义是非常像的,比如说:类型定
义、变量定义、使用方法上很相似。就像下面两个例子一样,把许多类型联合在一起

 union st{
 char a;
 int b;
 }

共用体也是一种自定义类型,可以通过它来创建变量,例如:

union num{
    int n;
    char ch;
    double f;
};
union num a, b, c;

也可以在定义共用体的同时创建变量:

union num{
    int n;
    char ch;
    double f;
} a, b, c;

如果不定义新的变量,也可以将共用体的名字省略:

union{
    int n;
    char ch;
    double f;
} a, b, c;

开锅解构

说到这里我扯一下结构体,结构体是用来存放一组不同类型的数据。结构体的定义形式为:

struct 结构体名{
结构体所包含的变量或数组
};

结构体和共用体又有什么渊源吗?
这里先端上一份代码:

#include <stdio. h>
 typedef union{
 int a;
 char c;
 //int a;
 //int b;
 }st;
 int main(void)
 {
 st bit;
 bit. c='B';
 // bit. a=10;
 //bit. b=60;
 printf("the haha size is%d\n", sizeof(bit));
 printf( "haha. c=%d\n", bit. c);
 return 0;
 }

我们可以看到结果:

通过上面的代码,可以发现这个共用体的大小,并不是像我们之前结构体那样是把每个成员所占内存大小加起来,而是我们上面说的那样,共用体由成员占用内存大小最大的那个决定的。

上面的示例中int占用4个字节大小,为最大的,所以 sizeof(bit) 得出结果就是4个字节大小,其实打印出来的结果a和b都是60,它是访问内存占用大小最大的那个成员的数值,因为那个’ B '的ASCII码值是是66。union访问其成员方式跟结构体是一样滴

其实结构体类似于一个人体,人体中的器官彼此是独立存在的,结构体的成员也是如此,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。

小结一手

  • 1.union中可以定义多个成员, union的内存大小由最大的成员的大小来决定。
  • 2.union成员共享同一块大小的内存,一次只能使用其中的一个成员。
  • 3.对某一个成员赋值,因为他们共用同一块内存,所以当他们字节数相同时,会覆盖其他成员的值;但如果不同就只会覆盖相同类型的成员。比如我赋值给int类型,就会覆盖其他int 类型而char类型只会在旁边吃瓜,不受影响。
  • 4.union的存放顺序都是由低地址开始存放。
  • 5.union中sizeof观测到的大小实际上是union中各个元素里面占用内存的最大的的那个元素大小。因为可以存得下这个就一定可以存的下其他元素。

以上就是C语言共用体union作用使用示例教程的详细内容,更多关于C语言共用体union的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言关键字union的定义和使用详解

    union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在"联合"中, 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度 .一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型. 当定义结构对象时,如果没有显式地初始化它们,则会采用一般初始化规则:如果该结构对象属于动态存储类型,那么其成员具有不确定的初始值

  • C语言联合体Union特点及运用全面讲解教程

    目录 前言 一.联合(共用体)定义 二.联合的特点及运用 三.联合的大小计算 总结 前言 上一期C语言快速入门我们学习了枚举类型及相关知识点 这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你一定会有所收获! 提示:以下是本篇文章正文内容,下面案例可供参考 一.联合(共用体)定义 联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体. 代码如下(示例): #include<stdio.h> union Un//联合类型的声

  • C语言编程中的联合体union入门学习教程

    联合体(union)在C语言中是一个特殊的数据类型,能够存储不同类型的数据在同一个内存位置.可以定义一个联合体使用许多成员,但只有一个部件可以包含在任何时候给定的值.联合体会提供使用相同的存储器位置供多用途的有效方式. 定义联合体 要定义联合体,必须使用union语句很相似于定义结构.联合体声明中定义了一个新的数据类型,程序不止一个成员.联合体声明的格式如下: union [union tag] { member definition; member definition; ... member

  • C语言 共用体(Union)详解及示例代码

    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{     成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意. 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响:而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员. 结构体占用的内存大于等于所有成员占用的内

  • C语言中联合体union的实例详解

     C语言中联合体union的实例详解 1.定义: union(int i, short s, char c) un; un.i = 3; printf("i=%d",un.i); printf("length = %d\n",sizeof(un);//==4,有最大的变量来决定 2.相当与java里的List T类型 3.数据交换 void swap(int *p , int *q){ int temp = *p; *p = *q; *q = temp; } 4.打

  • C语言、C++中的union用法总结

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这个问题,也希望大家和我讨论讨论.别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信.我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了).重构(后期我也会说的了)了,却忽略了那些最基础,最

  • C语言共用体union作用使用示例教程

    目录 共用体 union 开锅解构 小结一手 共用体 union 什么是共用体 union?这个共用体,估计大家平时在代码也比较少见,我去看了;其实这个共用体 union(也叫联合体)跟结构体定义是非常像的,比如说:类型定义.变量定义.使用方法上很相似.就像下面两个例子一样,把许多类型联合在一起 union st{ char a; int b; } 共用体也是一种自定义类型,可以通过它来创建变量,例如: union num{ int n; char ch; double f; }; union

  • 浅谈C语言共用体和与结构体的区别

    共用体与结构体的区别 共用体: 使用union 关键字 共用体内存长度是内部最长的数据类型的长度. 共用体的地址和内部各成员变量的地址都是同一个地址 结构体大小: 结构体内部的成员,大小等于最后一个成员的偏移量+最后一个成员大小+末尾的填充字节数. 结构体的偏移量:某一个成员的实际地址和结构体首地址之间的距离. 结构体字节对齐:每个成员相对于结构体首地址的偏移量都得是当前成员所占内存大小的整数倍,如果不是会在成员前面加填充字节.结构体的大小是内部最宽的成员的整数倍. 共用体 #include <

  • Golang语言学习拿捏Go反射示例教程

    目录 1. 反射简介 1.1 反射是什么? 1.2 为什么需要反射? 2. reflect包 2.1 基本反射 2.2 反射与指针 2.3 反射与对象 2.4 反射与函数 2.5 反射例子 3. 总结 1. 反射简介 1.1 反射是什么? Go语言提供了一种机制在运行时更新和检查变量的值.调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射.反射也可以让我们将类型本身作为第一类的值类型处理. 反射是指在程序运行期对程序本身进行访问和修改的能力,程序在编译

  • Go语言结构体Go range的学习教程

    目录 正文 Go Range 正文 在前一篇博客我们学习了 Go 数组,其要求所有元素为同一数据类型,如果希望存储不同类型的数据,就要用到结构体相关知识. 结构体的定义:存储相同或不同类型的数据集合. 有 C 相关经验,结构体还是比较容易理解的,语法格式如下所示: type struct_variable_type struct { member definition member definition ... member definition } 上述语法格式的关键字是 struct 和 t

  • Go语言快速入门指针Map使用示例教程

    目录 1. 指针 1.1 指针地址和指针类型 1.2 指针取值 1.3 空指针 1.4 new 的使用 1.5 new与make的区别 2. Map 2.1 什么是Map key,value存储 hash冲突 hash冲突的常见解决方法 开放定址(线性探测)和拉链的优缺点 2.2 Map 定义 2.3 map基本使用 2.4 map的遍历 2.5 map判断某个键是否存在 2.6 map使用delete()函数删除键值对 1. 指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,

  • 深入了解C++ 结构体(struct)与共用体(union)

    编码运行环境:VS2017+Win32+Debug,Win32表示生成32bits的应用程序. 结构体(struct)与共用体(union)是C语言中就已经存在的数据类型,C++对他们进行了扩充,最大的变化是允许在结构和公用体中定义成员函数.下面将通过实例讲解二者的特性和用法. 1.struct 以下是一个使用了结构体的C++程序. #include <iostream> using namespace std; struct Room { int floor; int No; }; stru

  • C语言 结构体数组详解及示例代码

    所谓结构体数组,是指数组中的每个元素都是一个结构体.在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生.一个车间的职工等. 定义结构体数组和定义结构体变量的方式类似,请看下面的例子: struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 }class[5]; 表示一个班级有5个学生. 结构体数组在定义的同时也可以初始化,例如: str

  • C语言中结构体和共用体实例教程

    目录 一.实验目的 二.实验内容 三.实验记录 3.1 候选人选票统计 3.2 print函数 3.3 链表 总结 一.实验目的 掌握结构体类型变量的定义和使用: 掌握结构体类型数组的概念和应用: 掌握链表的概念,初步学会对链表进行操作: 掌握共用体的概念与使用: 掌握指向结构体变量的指针. 掌握指向结构体数组的指针的应用. 二.实验内容 编写下列程序,然后上机调试运行. 对候选人得票的统计程序.设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果. 编写一个函数print,

  • go语言数组及结构体继承和初始化示例解析

    目录 分类 数组 数组定义 结构体 结构体继承 结构体初始化 成员的操作 同名字段 其它匿名字段 非结构体类型 结构体指针类型 结构体字段实现接口 分类 类型 名称 长度 默认值 说明 pointer 指针   nil   array 数组   0   slice 切片   nil 引⽤类型 map 字典   nil 引⽤类型 struct 结构体       数组 如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储.但是,问题是班级有80个学生,那么要定义80

随机推荐