C语言学习笔记-union

union是什么

union叫做联合体(也叫做共用体),是C语言中的一种类型。与结构体相似,其中可以添加成员,但不同的是这些成员共用同一段内存。

struct Data{
     int i;
     char cr[4];
} data;

union Demo{
    int i;
    char cr[1];
} demo;

data所占的内存大小是8个字节,demo所占的内存大小是4个字节。

为什么会有union,它使用来解决什么问题的?

  • 节省内存
    如嵌入式开发之类内存紧张的情况下会考虑这个问题,使用union可以节省内存开销。
  • 简化类型转换
    看了一些网上的说明,还没有形成自己完整的理解,先记录一下当前的认识。
    某些情况,传输/记录数据的时候使用的是某种类型(如char),但是实际表征的是其他类型的数据(如int)。此时的一般操作是需要进行转换,但是如果使用了union,则直接可以使用另一种类型的成员去直接访问.

有一篇文件讲述的稍微详细一点,大家可以参看,同时感谢作者。先附上原文链接:https://blog.csdn.net/debugzzj/article/details/81705755

设想用C语言实现这样一个功能。我需要用单片机读取一个监控温度的i2c slave的寄存器数据。这个寄存器是12位有效位寄存器。读出来之后我们要通过数据手册给定的公式计算成实际温度(设想这个公式为 temp = reg_val *10)。我们怎么实现呢?要知道,i2c的数据传输是按照byte传送的,也就是说,你只能用char类型结束数据,说白了,每个时序你只能接收8个bit的数据。所以12个bit需要读两次,用两个char类型变量或一个char类型数据接收。
读出寄存器数据(这个不在这篇文章的讨论范围内)
将读出的数据转换成可计算的数据类型(两个char类型转换成一个short或int或float类型)
根据公式计算
下面看一下不用union实现的函数

int fun( void )
{
  int tmp_value = 0; 
  char reg_val[2] = {0,0}; 
   .... 
  i2c.read(addr<<1, reg_val, 2); 
  tmp_value = (reg_val[1]<<8 | reg_val[0]); 

  return tmp_value*10; 
}
用union的

union REG_VAL { 
  int value; 
  char buf[2]; 
}reg_val; 

int fun( void )
{ 
  int tmp_value = 0; 
  char reg_val[2] = {0,0}; 
  .... 
  i2c.read(addr<<1, reg_val.buf, 2);

  return reg_val.value*10; 
}

基本了解了union的使用背景之后,接下来了解一下union的使用。

union的设计原则

  • union可以定义多个成员,其大小由最大成员的大小决定。
  • union成员共享同一块大小的内存,一次只能使用其中的一个成员。
  • 对某一个成员赋值,会改变其他成员的值。
  • union的存放顺序是 所有成员都从低地址开始存放。

union的使用

  • 变量定义
union 共用体名
{
  成员表列
}变量表列;

union Data
{
  int i;
  char c;
  float f;
} a, b, c;
  • 共用体变量的引用
a.i
a.c
a.f
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352