7.4 共用体

共用体又称为联合体,是由不同的数据类型组成的一个整体。与结构体不同的是,共用体每次只能使用其中一个成员。结构体的总长度是结构体所有成员长度之和,共用体的总长度是其中最长一个数据类型的长度,共用体的所有成员共享这一存储空间。在一些场合中,只需要使用某一类型的变量而其他类型的变量暂时不需要使用。当使用另一类型变量时,原先的变量也转为与程序无关,这种情况下可使用共用体节省同时存在多种数据类型变量所需要的额外空间。

7.4.1 共用体的定义

定义共用体使用修饰符 union,一般形式是:

union 共用体名
{
    成员列表
};

共用体名是该共用体独一无二的名称,命名规则与变量命名相同。成员项列表是共用体中数据成员的数据类型和名称,数据成员可以是变量、数组或者其他结构体等复合数据结构,各成员通常不使用相同的数据类型。成员项列表的一般形式为:

数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;

使用共用体声明变量的一般形式为:

union 共用体名 共用体变量名;

该语句只能在共用体定义后出现。如下例所示:

union unidate
{
    char a;
    int b;
    long c;
    doubule d;
};
union unidate x;

共用体成员中,长度最长的是双精度浮点型 d,共用体变量 x 的长度为双精度浮点型数据类型的长度。

7.4.2 共用体变量的引用

共用体变量的引用方式与结构体变量相同,一般形式为:

共用体名.成员名

但共用体一次只能使用一个成员,如下例所示:

#include <stdio.h>

int main(void)
{
union unidate // 共用体名
{
char a; // 共用体成员
int b;
long c;
double d;
}; union unidate x; // 声明共用体变量
x.a = 65; // 为成员 a 赋值
printf("x.a = %c\n", x.a); x.b = 100;
printf("x.b = %d\n", x.b); // 为成员 b 赋值 x.c = 10005000; // 为成员 c 赋值
printf("x.c = %ld\n", x.c); x.d = 0.69314718056; // 为成员 d 赋值
printf("x.d = %f\n", x.d); printf("x.a = %c\n", x.a); // 再次输出成员 a,这时成员 a 已经没被使用 return 0;
}

该程序的输出结果为:

x.a = A
x.b = 100
x.c = 10005000
x.d = 0.693147
x.a = 

最后一次输出的结果为不可预知的,因为共用体 x 的存储空间中已经被成员 x.d 使用过,而输出成员 x.a 前,没有重新为成员 x.a 赋值,这时如果引用成员 x.a 的数据,获得的是成员 x.d 的一部分数据,所以输出结果可能因系统环境的不同而有差异。

【C语言入门教程】7.4 共用体的更多相关文章

  1. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  2. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  3. 智能合约语言 Solidity 教程系列6 - 结构体与映射

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...

  4. C语言入门教程-(5)格式化输入输出

    1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...

  5. Go语言入门教程(十)之函数

    Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...

  6. c语言该怎么入门?C语言入门教程(非常详细)

    C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言.C语言是计算机产业的核心语言,操作系统.硬件驱动.关键组件.数据库等都离不开C语言:不学习C语言,就不能了解计算机底层. 这套「C语 ...

  7. 《JavaScript语言入门教程》记录整理:入门和数据类型

    目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...

  8. 《JavaScript语言入门教程》记录整理:面向对象

    目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...

  9. Go 语言入门教程,共32讲,6小时(已完结)

    Go语言入门教程,共32讲,6小时(完结) 在B站:https://www.bilibili.com/video/BV1fD4y1m7TD/

随机推荐

  1. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 1 Estimating unknown parameters

    Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

  2. Linux Command Line Basics

    Most of this note comes from the Beginning the Linux Command Line, Second Edition by Sander van Vugt ...

  3. Python KeyError

    Google一下轻松找到了答案,大家可以看一下Python Wiki,很简单,翻译如下. 在Python中,当你使用a[key]这种方式从字典中获取一个值时,若字典中不存在这个此key时就会产生一个K ...

  4. Linux 中 17 个 tar 命令实用示例

    Tar(Tape ARchive,磁带归档的缩写,LCTT 译注:最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的目录)是类 Unix 系统中使用最广泛的命令,用于归 ...

  5. Mysql学习笔记(七)mysql编程基础之自定义函数。

    delimiter $$ create function fn_liangzifunction() returns int no sql begin ; return @row_no; end; $$ ...

  6. Hibernate 配置文件与映射文件 总结

    hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 一.Hibernate配置文件详解 Hibernate配置文件有两种形式:XML与p ...

  7. arcglobe 图层三大类说明

    若是第一次打开,且在网络连接通畅的情况下,你会发现目录中已有部分数据层,这些数据层是由ArcGIS Online的在线数据:Imagery图层即在线的影像数据.高程数据.地名数据.运输线数据. Arc ...

  8. Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式及apr配置

    转: http://www.oschina.net/question/54100_16195omcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志. ...

  9. socketserver模块写的一个简单ftp程序

    一坨需求... 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 (cd) ...

  10. npm run-script

    package.json "scripts": { "start": "electron .", "package": ...