目录

前文列表

程序编译流程与 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. OpenHarmony 分布式硬件关键技术

    本文转载自 OpenHarmony TSC 官方微信公众号<峰会回顾第8期 | OpenHarmony 分布式硬件关键技术> 演讲嘉宾 | 李   刚 回顾整理 | 廖   涛 排版校对  ...

  2. mybatis 手写分页

    mybatis 手动分页查询 .xml文件 SELECT .... FROM dip_pack_box AS t1 LEFT JOIN dip_pack_content AS t2 ON t1.id ...

  3. windows下配置mask2former(facebook版)

    1.安装Anaconda 2.安装PyCharm 3.创建python3.8环境(最高3.8因为有一个依赖包最高支持python3.8) 4.安装GCC 下载地址:https://sourceforg ...

  4. 基于tapd的git commit规范

    现状 开发团队中,总是有人提交代码时的commit内容乱写一通,或者不明确不完整.当回溯代码的时候,很难通过commit内容定位历史记录,只能一条一条查看,找不到就要去问历史参与开发的其他同事,沟通成 ...

  5. Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

    开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量,干脆写个笔记备忘个,也方便小伙伴们节省时间. =================JDK安装与环境变量配置====== 1.官网下载j ...

  6. CentOS 7.9编译安装Python-3.10.13

    目录 查看CentOS版本.系统默认gcc版本.Python版本和pip版本 部署Python-3.10.13 测试 将yum中的Python版本修改为系统原来的2.7.5版本 查看CentOS版本. ...

  7. 力扣122(java&python)-买卖股票的最佳时机 II(中等)

    题目: 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格. 在每一天,你可以决定是否购买和/或出售股票.你在任何时候 最多 只能持有 一股 股票.你也可以先购买 ...

  8. 搭建Hadoop环境

    搭建Hadoop环境 一.虚拟机的安装 二. 安装JDK 1.下载jdk wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41- ...

  9. 一文详解 Serverless 架构模式

    什么是 Serverless 架构?按照 CNCF 对 Serverless 计算的定义,Serverless 架构应该是采用 FaaS(函数即服务)和 BaaS(后端服务)服务来解决问题的一种设计. ...

  10. 基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇

    ​简介: 本文简要介绍了基于 MySQL 结合 Tablestore 的大规模订单系统方案.这种方案支持大数据存储.高性能数据检索.SQL搜索.实时与全量数据分析,且部署简单.运维成本低. ​ 作者 ...