目录

文章目录

  • 目录
  • 前文列表
  • 共用体
  • 定义共用体
  • 访问共用体成员

前文列表

《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
《C 语言编程 — 高级数据类型 — 数组》
《C 语言编程 — 高级数据类型 — 字符串》
《C 语言编程 — 高级数据类型 — 枚举》
《C 语言编程 — 高级数据类型 — 结构体与位域》

共用体

共用体是一种特殊的数据类型,允许在相同的内存空间存储不同的数据类型。共用体具有多个成员,但同一时刻只能有一个成员被赋值。共用体提供了一种使用相同的内存空间的有效方式。

  • 共用体变量包含的成员都占用同一块内存空间。各成员使用同一个起始地址。但在某个瞬间,只能有一个成员生效,即内存空间同一时间只会存放一个成员的数据值。
  • 共用体变量中的一个成员被赋值后,原有变量成员的数据就会被冲掉。若连续为各个成员进行赋值,那么只有最后一个被赋值的成员的数据值有效。
  • 共用体变量不能作为函数参数,函数也不能返回联合体类型,但指向共用体变量的指针变量可以作为函数参数,函数也可以返回共用体类型指针变量。

定义共用体

使用 union 关键字定义共用体类型:

union [union tag] {member definition;member definition;...member definition;
} [one or more union variables];
  • union tag 是共用体类型的标识(共用体名称),为可选。
  • member definition 是标准的变量定义,比如 int i;
  • 在共用体定义的末尾,可以指定若干个共用体类型变量,也是可选的。
union Data {int i;float f;char  str[20];
} data;

现在,Data 共用体类型的变量可以存储一个整数、或一个浮点数,或一个字符串,这些数值都会存储在同一个内存空间,但同一时刻只会有一个数值存在,共用体占用的内存空间为共用体中最大的成员的空间。可以根据需要在一个共用体内使用任何内置的或用户自定义的数据类型。

下面的实例显示共用体占用的总内存大小:

#include <stdio.h>
#include <string.h>union Data {int i;float f;char  str[20];
};int main() {union Data data;printf("Memory size occupied by data : %lu\n", sizeof(data));return 0;
}

访问共用体成员

依旧是使用成员访问运算符 .

#include <stdio.h>
#include <string.h>union Data {int i;float f;char  str[20];
};int main() {union Data data;data.i = 10;data.f = 220.5;strcpy(data.str, "C Programming");printf("data.i : %d\n", data.i);printf("data.f : %f\n", data.f);printf("data.str : %s\n", data.str);return 0;
}

运行:

$ ./main
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

上述可见 data.idata.f 的数值被损坏了,这是因为最后赋值的共用体变量成员 str 将 i 和 f 的内存空间覆盖了。

共用体正确的使用方法如下:

#include <stdio.h>
#include <string.h>union Data {int i;float f;char  str[20];
};int main() {union Data data;data.i = 10;printf( "data.i : %d\n", data.i);data.f = 220.5;printf( "data.f : %f\n", data.f);strcpy( data.str, "C Programming");printf( "data.str : %s\n", data.str);return 0;
}

运行:

$ ./main
data.i : 10
data.f : 220.500000
data.str : C Programming

C 语言编程 — 高级数据类型 — 共用体相关推荐

  1. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  2. Go 语言编程 — 高级数据类型 — 结构体

    目录 文章目录 目录 结构体 访问结构体成员 向函数传递结构体 结构体指针 结构体标签(Struct Tag) 结构体 Golang 中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.与 ...

  3. C 语言编程 — 高级数据类型 — void 类型

    目录 文章目录 目录 前文列表 void 类型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> & ...

  4. C 语言编程 — 高级数据类型 — 字符串

    目录 文章目录 目录 前文列表 字符串 字符串拷贝 字符串比较 strcmp strncmp 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> &l ...

  5. C 语言编程 — 高级数据类型 — 枚举

    目录 文章目录 目录 前文列表 声明枚举类型 定义枚举类型的变量 枚举类型变量的枚举值 枚举在 switch 语句中的使用 将整型转换为枚举类型 前文列表 <程序编译流程与 GCC 编译器> ...

  6. C 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 前文列表 数组 声明数组 初始化数据 访问数组元素 二维数组 指向数组的指针 将数组指针作为实参传入函数 从函数返回一个数组指针 指针数组 数组名和取数组首地址的区别 前文列表 ...

  7. C 语言编程 — 高级数据类型 — 指针

    目录 文章目录 目录 前文列表 指针 声明一个指针变量 使用指针 空指针 悬空指针 野指针 指针的算术运算 指向指针的指针 将指针作为实际参数传入函数 从函数返回指针 一个古老的笑话 前文列表 < ...

  8. Go 语言编程 — 高级数据类型 — Interface、多态、Duck Typing 与泛式编程

    目录 文章目录 目录 Golang 的接口 Interface 实例存储的是实现者的值 如何判断某个 Interface 实例的实际类型 Empty Interface Interface 与多态 I ...

  9. Go 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 数组 定义数组 数组与切片的区别 访问数组元素 多维数组 初始化二维数组 访问二维数组 向函数传递数组 指针数组 数组 数组是具有相同数据类型的一组已编号且长度固定的数据项序列, ...

最新文章

  1. Java程序流程控制(顺序结构、分支结构、循环结构、if-else、switch-case、for、while、do-while、break、continue、return)
  2. 【类库】私房干货.Net数据层方法的封装
  3. springboot启动后卡住 无日志的几种情况
  4. 文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件
  5. python读取坐标文本文件_Python 实现文件读写、坐标寻址、查找替换功能
  6. node mysql sequlize_玩转Node.js-Sequelize基础
  7. 1小时学会jQuery,全程无废话,直接上代码
  8. ajax异步下载文件并判断状态
  9. 自定义万能回弹插值器 BounceInterpolator
  10. 为什么要使用Memcached
  11. 5G无线增强设计与国际标准 个人整理(PDF和Word)
  12. Java随笔记录第二章:输入输出流程控制
  13. 自动禁用并启用所有网络连接源码
  14. 量子力学最新发现:人不会真正死去
  15. 安装 Windows 7 VM虚拟机
  16. SSM项目跨域访问处理(含白名单处理)
  17. 开发中你不得不知的一些英文缩写(专业术语)
  18. Vue如何使用iconfont(阿里图标库)
  19. insmod: error inserting 'vivi.ko': -1 Unknown symbol in module 问题解决办法
  20. excel表如何汇总统计平均值

热门文章

  1. gui窗口遮挡算法_基于 C 语言开发的 GUI 框架
  2. 量子计算机个人化时间,科学家发现量子算法可以停止时间
  3. Xcode 报错Could not find developer disk image,iOS10
  4. 腾讯AR开放平台今日正式开放,提供识别、追踪、展现等多项能力
  5. 冬眠动物克服肌肉萎缩,靠的居然是“肠子”|Science
  6. 连鸽14年的哈勃望远镜“继任者”终于发射了!耗资600亿,能给136亿年前星系拍照...
  7. 400万奖金池,倪光南、邓中翰等顶级学者指导,大手笔芯片比赛邀你参与
  8. 十几年后我才知道,嫁了一个硬核老公
  9. 量产加速!干线物流创新中心迎地平线入伙,嬴彻地平线达成战略合作
  10. mysql数据导入、导出