C语言:关键字---union(声明共用体类型)
C语言32个关键字
有32个关键字详细说明,还有跳转链接!
一、union 简介
union 是C语言中一种声明共用体的数据类型。
union(共用体)在某种程度上类似struct(结构体)的一种数据结构,可以包含很多数据结构和变量。
union(共用体)的特点:其内部的数据 共用一个内存首地址,共享同一段内存,以达到节省空间的目的。
二、union 定义
1. 声明共用体类型
一般形式具体如下:
union 共用体名
{//成员列表数据类型 成员名;数据类型 成员名;....
}
举例说明如下:
union _MQ
{char data8[4];int data32;
};
2. 定义共用体变量
一般形式具体如下:
union _MQ
{char data8[4];int data32;
};
//定义共用体变量
union _MQ mq;
合并简化形式具体如下:
union _MQ
{char data8[4];int data32;
}mq;
匿名结构体形式具体如下:
union
{char data8[4];int data32;
}mq;
3. 使用 typedef 声明共用体类型,再定义共用体变量
一般形式如下:
typedef union MQ
{char data8[4];int data32;
} _MQ;
//定义共用体变量,以下两种效果一样
union MQ mq;
_MQ mq;
匿名共用体形式具体如下:
typedef union
{char data8[4];int data32;
} _MQ;
//定义共用体变量
_MQ mq;
三、union 使用方法
共用体变量成员----赋值(.)
初始化定义时----赋值
typedef union
{char data8[4];int data32;
}_MQ; _MQ mq =
{.data32=0x12345678
};
初始化后----赋值
mq.data32=0x12345678;
union(共用体)----共用内存
#include <stdio.h>typedef union
{char data8[4];int data32;
}_MQ; _MQ mq =
{.data32=0x12345678
};int main(int argc, char *argv[])
{printf("data[0]=0x%x\n",mq.data8[0]);printf("data[1]=0x%x\n",mq.data8[1]);printf("data[2]=0x%x\n",mq.data8[2]);printf("data[3]=0x%x\n",mq.data8[3]);return 0;
}
运行结果如下:
union(共用体)----判断系统大小端模式
我的电脑系统是小端模式
大端模式(高字节在前) | 小端模式(低字节在前) | |||||||
---|---|---|---|---|---|---|---|---|
data32 | data[0] | data[1] | data[2] | data[3] | data[0] | data[1] | data[2] | data[3] |
0x12345678 | 0x12 | 0x34 | 0x56 | 0x78 | 0x78 | 0x56 | 0x34 | 0x12 |
四、union 占用的内存空间
union(共用体) 占用的内存空间,是由其中占用内存最大的成员变量决定的。
#include <stdio.h>typedef union
{char data1;int data2;float data3;double data4;
}_MQ;
_MQ mq;int main(int argc, char *argv[])
{printf("data1占用的%d字节\n",sizeof(mq.data1));printf("data2占用的%d字节\n",sizeof(mq.data2));printf("data3占用的%d字节\n",sizeof(mq.data3));printf("data4占用的%d字节\n",sizeof(mq.data4));printf("共用体占用的%d字节\n",sizeof(mq));return 0;
}
运行结果如下:
五、位结构和共用体联合使用
具体程序如下:
#include <stdio.h>typedef union
{int data;struct {int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14,15位}bit;
}_MQ; _MQ mq=
{.bit.a = 1,.bit.b = 3,.bit.c = 6,.bit.d = 10,.bit.e = 26
};int main(int argc, char *argv[])
{printf("data=0x%x\n",mq.data);return 0;
}
运行结果如下:
解释说明:
变量 | 15 14 13 12 11 10 | 9 8 7 6 | 5 4 3 | 2 1 | 0 |
---|---|---|---|---|---|
a(1) | 1 | ||||
b(3) | 11 (3) | ||||
c(6) | 110 (6) | ||||
d(10) | 1010 (10) | ||||
e(26) | 011010 (26) |
结果是0b0110101010110111=0x6ab7
C语言:位结构体
C语言:关键字---union(声明共用体类型)相关推荐
- C语言程序设计(Part Ⅸ)——链表/共用体类型/枚举类型
C语言程序设计(Part Ⅸ)的整理笔记,若有错误,欢迎指正. 用指针处理链表 如果有一批数据要存储和引用,有两种方法: 一种方法是采取分配固定存储单元的方法,例如数组.但是在程序执行期间,数组的大小 ...
- 【C++】(十五)自定义数据类型——共用体类型、枚举类型
文章目录 自定义数据类型--共用体类型.枚举类型 1 共用体类型 2 枚举类型 3 typedef 自定义数据类型--共用体类型.枚举类型 1 共用体类型 共用体(union)是一种成员共享存储空间的 ...
- C语言:关键字---struct(声明结构体类型)
C语言32个关键字 有32个关键字详细说明,还有跳转链接! 一.struct-简介 struct就是结构体,用来描述需要相同类型或不同类型数据的数据对象. 通俗的说法就是打包封装,将一些分散的数据整合 ...
- 【c语言基础必备】共用体union
共用体是C 语言的另外一种构造类型,与前面介绍的结构体类似.共用体也由基本数据结构组合而成,但是共用体和结构体却有本质区别,因为结构体中的每个成员都占用存储单元,所以结构体所占用的内存大小为所有成员各 ...
- C语言n番战--共用体和枚举(八)
嵌入式之路,贵在日常点滴 ---阿杰在线送代码 目录 一.共用体 共用体的声明以及访问 如何理解"共用体的所有成员占用同一段内存" 共用体的暂用空间的大小 用途: 二.枚举 三.t ...
- C 语言编程 — 高级数据类型 — 共用体
目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...
- c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...
C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
- 【C语言】共用体的定义与使用
目录 一.共用体数据类型的定义 二.共用体变量的定义 三.共用体内存分配 四.共用体变量的初始化和引用 一.共用体数据类型的定义 共用体类型同结构体类型一样,都属于构造类型,它在定义上与结构体类型十分 ...
- c语言关键字大全(32个)
C 语言可以像汇编语言一样对位.字节和地址进行操作,而这三者是计算机最基本的工作单元.以下是店铺为大家整理的c语言关键字大全,欢迎阅读 1.auto :声明自动变量 2.break:跳出当前循环 3. ...
最新文章
- cacti命令行添加监控详解
- 属性为nil的时候测试是否crash nil是不会崩溃的
- loj #6053 简单的函数 min_25筛
- xmpp muc 群聊协议 1
- eclipse 设置 默认编码为 utf-8
- [译]Hour 7 Teach.Yourself.WPF.in.24.Hours
- 最简单,最明了,看了就会的VScode和C++的配置!(Visual Studio Code)
- 微型计算机最怕的是什么,为什么以前学生上“微机课”都要穿鞋套?老师:怕电脑中病毒...
- java工作流flowable
- python3 import的一个细节
- DAOS 源码解析之 daos_api
- 图像加密-安全性分析
- Oracle问题imp-10019:由于ORACLE错误12899而拒绝行
- Windows Snapshot Grabber 2020中文版
- 微信开放平台开发 微信登录
- python语法速成方法_一天快速入门Python语法基础之函数
- 会声会影浪漫婚礼视频——美到想哭
- 2020/7/17 积分不等式/反常积分/定积分应用
- linux下调整分辨率
- Android检测模拟器
热门文章
- 微支付js-api,java版的坑。
- bzoj1492 货币兑换cash dp斜率优化+splay/cdq分治
- ChatGPT报错:Too many requests in 1 hour. Try again later.
- 媒体的态度和立场如何掌握?
- python 3.6.5 java jdk版本_eclipse开发者版本下载-eclipse ide for java developers最新版v3.6.0 pc版 - 极光下载站...
- 关于版本号正则表达式中英文符号问题
- C: warning C275: expression with possibly no effect
- tkinter+miniblink实现网页组件
- 程序包无效:“CRX_HEADER_INVALID“ 解决办法
- 论坛php 图片上传,Discuz上传图片失败的解决方法