C语言基础 - 通过案例历学 - 共用体


本文通过实例介绍了C语言中共用体的概念与使用

阅读本文前推荐先阅读:结构体

1.什么是共用体?

答:共用体是C语言中一种用户自定义数据类型,它提供了一种使用相同的内存位置的有效方式。其特点是: 可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值

2.共用体的定义方法与结构体类似

当然我们推荐花3分钟先掌握结构体(点击标题中的链接),因此为了不重复起见这里我们也是直接从以下代码开始:

#include <stdio.h>
#include <string.h>// 先定义公用体,其定义形式与结构体类似,只不过关键字从struct变成了union
union{char  SecoendName[50];char  FirstName[50];char  gender[50]; int   age;
}stdt1;int main(){strcpy( stdt1.SecoendName, "李");strcpy( stdt1.FirstName, "华"); strcpy( stdt1.gender, "男");stdt1.age = 17;// 然后我们试着在终端打印出这些值,看看运行结果printf( "姓 : %s\n", stdt1.SecoendName);printf( "名 : %s\n", stdt1.FirstName);printf( "性别 : %s\n", stdt1.gender);printf( "年龄 : %d\n", stdt1.age);return 0;
}

运行结果:

姓 :
名 :
性别 :
年龄 : 17--------------------------------
Process exited after 0.008393 seconds with return value 0
请按任意键继续. . .

我们发现在上述程序运行中,只有stdt1.age的值是正常的,而其它的都发生了错误,然而在struct所定义的结构体中却没有出现这样的情况!其原因为:

共用体中最后赋给变量的值占用了内存位置

作为比较,我们再看下例:

#include <stdio.h>
#include <string.h>union{char  SecoendName[50];char  FirstName[50];char  gender[50]; int   age;
}stdt1;int main(){strcpy( stdt1.SecoendName, "李");printf( "姓 : %s\n", stdt1.SecoendName);strcpy( stdt1.FirstName, "华"); printf( "名 : %s\n", stdt1.FirstName);strcpy( stdt1.gender, "男");printf( "性别 : %s\n", stdt1.gender);stdt1.age = 17;printf( "年龄 : %d\n", stdt1.age);return 0;
}

运行结果:

姓 : 李
名 : 华
性别 : 男
年龄 : 17--------------------------------
Process exited after 0.00925 seconds with return value 0
请按任意键继续. . .

可以看到,这里却正常输出了共用体中所有变量的值!
但这并不意味着这些值在同一时刻都是我们预期所看到的,相反,只不过是这次我们调整了调用printf()函数的顺序,使得printf()函数在同一时间只用到一个成员,并且这个成员正好是最后被赋值的那个成员。因此这里的本质问题就在于:

共用体中的所有成员变量,他们使用的是同一内存位置。每次对其中任一变量赋值都改变的是该同一内存地址的存储内容。

最后共用体特点归纳如下:

  • 共用体的定义和访问都与结构体类似;
  • 共用体实际上是相同的内存位置存储不同的数据类型,变量可以存储如一个整数、一个浮点数,或者一个字符串;
  • 共用体占用的内存应足够存储共用体中最大的成员;
  • 共用体任何时候只能有一个成员带有值;
  • 共用体中最后赋给变量的值占用了公用的那块内存位置,也就仅有是该变量的赋值是可用的;

C语言基础专题 - 通过案例历学 - 共用体相关推荐

  1. C语言基础专题 - 通过案例历学 - 结构体

    C语言基础专题 - 结构体的概念与用法 本文通过实例介绍了C语言中结构体的概念与使用. 阅读本文前推荐阅读:数组 阅读本文后推荐阅读:共用体.位域 1.

  2. C语言基础专题 - 指针(编写中)

    C语言基础专题 - C的灵魂没了篇 本文介绍了C语言中指针及其用法 - 由于博主水平有限,疏忽在所难免.若发现错误请告知博主更正,十分感谢. - 邮箱:291148484@163.com - 希望博文 ...

  3. C语言基础专题 - 头文件引用

    C语言基础专题 - 头文件引用 本文介绍了C语言中头文件的引用方法 阅读本文前推荐阅读C语言预处理 1.

  4. C语言基础专题 - 预处理

    C语言基础专题 - 预处理 本文介绍了C语言中预处理的相关概念 相关内容推荐阅读:C语言头文件引用 1.

  5. C语言基础专题 - 数组(编辑中)

    C语言基础专题 - 数组 本文介绍了C语言中数组地相关知识 阅读本文前推荐阅读:C语言数据类型 阅读本文后推荐阅读:C语言结构体 阅读本文后推荐阅读:C语言字符串 其它推荐阅读:python序列 1.

  6. C语言基础专题 - 存储类(编辑中)

    C语言基础专题 - 存储类 本文介绍了C语言中存储类的相关知识.用法,以及相比之下C++存储类的扩展与差异. 1.

  7. C语言基础专题 - 数据类型与强制类型转换(编辑中)

    C语言 - 数据类型与强制类型转换 1.C数据类型 可以参考的相关知识链接: C语言基础专题 - 指针 C语言基础专题 - 数组 C语言基础专题 - 字符串 C语言基础专题 - 结构体 C语言基础专题 ...

  8. java过滤器经典案例_JAVA语言基础的经典案例:猜字母游戏

    设计数据结构 问题 猜字母游戏规则为,随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串,玩家可以猜测多次,每猜测一次,由系统提示结果,如果猜测的完全正确则游戏结束,计算玩家的游戏 ...

  9. 中国大学慕课 大连理工大学 C语言程序设计 第11周 结构与共用体

    1 某班有5名同学,建立一个学生的简单信息表,包括学号.姓名.3门课程的成绩,编写程序,计算每名学生的平均成绩及名次.(30分) 题目内容: 某班有5名同学,建立一个学生的简单信息表,包括学号.姓名. ...

最新文章

  1. 利用计算机技术执行去自动化,计算机技术和自动化的关系.doc
  2. linux 僵尸进程 defunct
  3. 一个失败项目的复盘会
  4. 哈,又一款超级简单的队列(MQ)实现方案来了~
  5. 一个物理学家学习Windows编程的感受
  6. 使用 MarkDown DocFX 升级 Rafy 帮助文档
  7. python从列表随机取出多个数据_【python】从数组随机取数据
  8. 不同的电脑打印预览不同怎么解决_条码打印软件中标签预览正常打印无反应怎么解决...
  9. C语言中scanf()的用法
  10. POJ 3617 Best Cow Line
  11. perl脚本GET系统命令执行
  12. 计算机桌面界面组成,win10桌面添加分类框,电脑桌面归纳小窗口
  13. python中rank_hackerrank中python题目的套路
  14. 配置和google浏览器版本一直的webdriver
  15. dci odbc mysql_人大金仓-
  16. mpv - 一个免费、开源、跨平台的多媒体播放器
  17. 变压器励磁模型 Matlab/simulink 可用于模拟电压暂降等电能质量问题
  18. 7个实用的Python自动化代码,别再重复造轮子了!
  19. [UE4]射击产生弹孔:Spawn Decal At Location、Spawn Decal Attached
  20. OGG-01008 Extract displays Discarding bad record (discard recs=1) when using filter or where clause

热门文章

  1. LeetCode 240. Search a 2D Matrix II
  2. 【重点】剑指offer——面试题62:序列化二叉树
  3. 【深度学习】CNN模型的可视化-1
  4. Python3.6 所有内置函数
  5. 02(d)多元无约束优化问题-拟牛顿法
  6. C++ primer plus学习笔记 (3) _函数
  7. 数组、字典转json串,不支持字符串
  8. 160505、oracle 修改字符集 修改为ZHS16GBK
  9. 四 过滤模式 map Only - 作业完成 bloomFilter、top10、去重
  10. Linux下安装配置git