目录

前文列表

程序编译流程与 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语言-10-位域与共用体

    位域 在某种特定情况下,一个结构体中的多个变量只使用各自存储空间的几位,而其他位从来不使用.这种情况下,可以使用位域来限定每个变量的用来存储数据的位宽. 作用 限定结构体中变量用来存放数据的位宽,即使 ...

  2. R语言编程艺术# 数据类型向量(vector)

    R语言最基本的数据类型-向量(vector) 1.插入向量元素,同一向量中的所有的元素必须是相同的模式(数据类型),如整型.数值型(浮点数).字符型(字符串).逻辑型.复数型等.查看变量的类型可以用t ...

  3. C语言程序设计(十二) 结构体和共用体

    第十二章 结构体和共用体 当需要表示复杂对象时,仅使用几个基本数据类型显然是不够的 根本的解决方法是允许用户自定义数据类型 构造数据类型(复合数据类型)允许用户根据实际需要利用已有的基本数据类型来构造 ...

  4. [C#.NET 拾遗补漏]14:使用结构体实现共用体

    在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...

  5. C语言高级-结构,共用体,文件,链表

    C语言结构 标准声明方式 struct student{        int age;        char sex;    }; 这个可以在main函数中定义:  struct student ...

  6. C/C++编程笔记:C语言对齐问题【结构体、栈内存以及位域对齐】

    引言 考虑下面的结构体定义: 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4. 现在,我们编写一个简单的程序: 运行后输出: 为什么会这 ...

  7. 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型

    函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...

  8. (C语言)共用体union的使用方法举例

    曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...

  9. 07.C语言:结构体、共用体、枚举

    一.结构体 是一种复合的数据类型,由多个不同类型的数据(为结构体的成员)组成的集合. 在c语言中没有给出结构体这种类型具体的形式(名称),但是给出类定义该结构体类型的方法(格式). 在使用结构体类型时 ...

  10. ndk学习之C语言基础复习----结构体、共用体与C++开端

    自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...

随机推荐

  1. #dp,齐肯多夫定理#CF126D Fibonacci Sums

    题目 \(T(T\leq 10^5)\) 组数据,每次给定数字 \(n(n\leq 10^{18})\), 问有多少种方案将 \(n\) 分解成若干个互不相同的斐波那契数 分析 如果找到一个方案使得所 ...

  2. 使用Python插入100万条数据到MySQL数据库并将数据逐步写出到多个Excel

    Python插入100万条数据到MySQL数据库 步骤一:导入所需模块和库 首先,我们需要导入 MySQL 连接器模块和 Faker 模块.MySQL 连接器模块用于连接到 MySQL 数据库,而 F ...

  3. IE8发送ajax请求无效

    IE是个非常有个性的浏览器,常规的东西在他这个都不太好使. 最开始发送ajax请求,总是不成功,也没啥报错,反正就是请求被忽略了 然后我就考虑用原生的JS来实现,然后就:哎呀  可以了...... x ...

  4. Mongoose介绍

    官网 Mongoose.js中文网 (mongoosejs.net) 基本使用 安装 最新的是mongoose8.0.0版本,基于Promise,以前的版本是基于回调函数. npm npm i mon ...

  5. 直播预告丨Hello HarmonyOS进阶系列课程重磅来袭,4月27日开播

    为了帮助初识HarmonyOS的开发者快速入门,我们曾推出Hello HarmonyOS系列一共5期课程(传送门:https://developer.huawei.com/consumer/cn/tr ...

  6. 重新点亮shell————sed其他命令[十一]

    前言 简单介绍一下其他增删查. 正文 删除命令: 例子: 插入和更改: 例子i: 例子c: 读文件和写文件: 例子r: 下一行命令: 打印: 例子: 只想输出匹配的行: 退出命令: 前面的运行效率更高 ...

  7. Unable to determine application id: com.android.tools.idea.run.ApkProvisionException: No outputs for the main artifact of variant: debug

    前言 遇到这种情况极大可能属于gradle 与 android studio版本不匹配的情况. 因为我是在升级android studio遇到的这个问题. 方法 一个方法是:降低android stu ...

  8. Web前端 -- ES6

    ES标准中不包含 DOM 和 BOM的定义,只涵盖基本数据类型.关键字.语句.运算符.内建对象.内建函数等通用语法. 本部分只学习前端开发中ES6的最少必要知识,方便后面项目开发中对代码的理解. 1. ...

  9. Phoenix 时区问题

    最近在测试flink从trino查询数据插入到phoenix5的功能,发现一个时间的问题: 明明插入的时间是 '1940-06-01',查询出来的时间会少一天,同样的 Timestamp 也会自动少掉 ...

  10. dojo\dart脚本编程语言

    Dojo是一个用于构建高效.可扩展的Web应用程序的开源JavaScript框架.它提供了一系列功能丰富的模块和组件,包括DOM操作.事件处理.异步编程.动画效果等.Dojo还具有强大的用户界面(UI ...