转自:http://blog.csdn.net/feimor/article/details/6858103

使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型,各字段共享一块内存,实际应用中却不知道它的具体用途。

今天读《编程卓越之道》中看到有对其使用的简单介绍,记录在此:

首先摘录一下struct和union的重要区别:

struct为每个字段在不同的偏移处分配存储空间,而联合则将所有的字段重叠在内存中的相同偏移处。

联合类型的用途:

1、创建别名。别名是内存对象原名之外的其他名字。比如在程序中经常会用到将一个数据类型强制转换为另一个类型,这个操作可以使用联合来代替。

比如typedef union{

char c;

uint32 u;

}CharOfUnion v;

可以通过v.u来操作一个uint32类型的对象,当需要将uint32变量的低端字节看做一个字符的时候,只需要访问v.c就可以了。

实际应用中,大多数的协议结构定义中,都会使用union类型来定义。

2、使用联合来将较大的对象分解成组成这个对象的各个字节。(尤其在单片机编程中将float拆解成char)

typedef union{

uint u;

char bytes[4];

}asBytes composite;

可以使用composite.bytes数组来访问composite.u字段的各个字节。

转自:http://blog.163.com/yx_xie2007/blog/static/1024642532011101411940162/

一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住。这次看书又看到了,还是学习一下吧。
一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂。本质上来说和结构体是一样的,但是从包装的角度来看有差异。

1、union中可以定义多个成员,union的大小由最大的成员的大小决定。 
2、union成员共享同一块大小的内存,一次只能使用其中的一个成员。 
3、对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)

4、联合体union的存放顺序是所有成员都从低地址开始存放的。
下面看一个简单的代码:

#include <stdio.h>
 
typedef union{
 char c;
 int a;
 int b;
}Demo;
 
int main(int argc, char **argv)
{
 Demo d;
 d.c = 'H';
 d.a = 10;
 d.b = 12;
 
 printf("size: %d\n", sizeof(d));
 printf("%c\t%d\t%d\n", d.c, d.a, d.b);
 
 return 0;
}

原创文章,转载请注明:
本文出自程序人生 >> C语言union(联合体 共用体)

ps:红色字体部分为本人添加。

C语言中Union类型的使用方法的更多相关文章

  1. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  2. c语言中register类型的变量

    C语言中: 一.register变量 关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中.有以下几点注意的地方. register变量必须是能被CPU寄存器所接受的类型,这通常意味着re ...

  3. C语言中的const,free使用方法具体解释

    注意:C语言中的const和C++中的const是有区别的,并且在使用VS编译測试的时候. 假设是C的话.请一定要建立一个后缀为C的文件.不要是CPP的文件. 由于.两个编译器会有区别的. 一.C语言 ...

  4. C语言中malloc函数的使用方法

    C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...

  5. c语言中enum类型的用法

    11.10 枚举类型 在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量说明为整型,字符型或其它类型显然是不妥当的 ...

  6. C语言中long类型,int类型

    long类型表示long int,一般简写为long,注意long不表示long double.虽然有时候会有sizeof(long)=sizeof(int),long int与int是不同的: 16 ...

  7. C语言中union关键字

    union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...

  8. R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不 ...

  9. C语言中register类型的变量有什么意义

    int i; for(i=0; i<1000; i++){ // Some Code } 为了解决这个问题,可以将使用频繁的变量放在CPU的通用寄存器中,这样使用该变量时就不必访问内存,直接从寄 ...

随机推荐

  1. C语言学习记录_2019.02.12

    "学计算机一定要有一个非常强大的心理状态,计算机不是黑魔法,都是人想出来的,别人能够想的出来,那么,总有一天,我也能够想的出来." 指针类型的变量就是保存地址的变量. int* p ...

  2. 大数据入门第九天——MapReduce详解(六)MR其他补充

    一.自定义in/outputFormat 1.需求 现有一些原始日志需要做增强解析处理,流程: 1. 从原始日志文件中读取数据 2. 根据日志中的一个URL字段到外部知识库中获取信息增强到原始日志 3 ...

  3. 简单的贝叶斯分类器的python实现

    # -*- coding: utf-8 -*- ''' >>> c = Classy() >>> c.train(['cpu', 'RAM', 'ALU', 'io ...

  4. 【转载】COM小结

    原文:http://blog.csdn.net/byxdaz/article/details/6595210 一.Com概念 所谓COM(Componet Object Model,组件对象模型),是 ...

  5. 1444: [Jsoi2009]有趣的游戏

    1444: [Jsoi2009]有趣的游戏 链接 分析: 如果一个点回到0号点,那么会使0号点的概率增加,而0号点的概率本来是1,不能增加,所以这题用期望做. 设$x_i$表示经过i的期望次数,然后初 ...

  6. 爬虫-设置代理ip

    1.为什么要设置代理ip 在学习Python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术导致爬取失败.高强度.高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网 ...

  7. 使用cJSON库解析JSON

    cJSON库的下载 cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJS ...

  8. Python学习过程笔记整理(三)

    函数 -函数使用 -函数需要先定义,定义不会执行函数 -使用函数,俗称调用 -定义函数 -格式:def 函数名称(参数=默认值):,函数名称不能用大驼峰,参数可以没有 -调用函数 -格式:函数名(参数 ...

  9. Jupyter安装及运行

    一.安装(来自http://jupyter.org/install) Ctrl+Alt+T(Manjaro系统),打开控制台,su进入root权限 输入如下命令: python3 -m pip ins ...

  10. egret性能优化总结

    ## 来自官方的优化建议 详见:http://edn.egret.com/cn/article/index/id/287 (1) 少使用Alpha混合. (2) 显式停止计时器,让它们准备好进行垃圾回 ...