共用(Union)与枚举(Enum)

共同体

c语言中,不同的成员使用共同的存储区域的数据结构类型称为共用体。(共用,联合体),共用体在定义,说明,适用形式上与结构体相似。两者本质上的不同在于使用内存的方式上。

定义:

  1. union unionName{
  2. 成员列表;
  3. };

大小:对于结构体不考虑内存对齐,其大小是各成员之和。对于共同体,成员中最大的元素所占用的空间大小。

成员地址:结构体每个成员均有自己独立的地址。共用体而言,所有的策划给你元独有一个地址。

  1. typedef struct _structTest{
  2. char a;
  3. short b;
  4. int c;
  5. }MyStruct;
  6. typedef union _unionTest{
  7. char a;
  8. short b;
  9. int c;
  10. }MyUnion;
  11. int main() {
  12. MyStruct s;
  13. MyUnion u;
  14. printf("sizeof(struct) = %d sizeof(union) = %d\n",sizeof(MyStruct),sizeof(MyUnion));
  15. printf("%p %p %p\n",&s.a,&s.b,&s.c);
  16. printf("%p %p %p\n",&u.a,&u.b,&u.c);
  17. //MyUnion u = {0x123456789};//这样初始化只初始化第一个成员
  18. u.c = 12345678;
  19. printf("%d %d %d\n",u.a,u.b,u.c);
  20. return 0;
  21. }
  22. //sizeof(struct) = 8 sizeof(union) = 4
  23. /*
  24. 0061FEA8 0061FEAA 0061FEAC
  25. 0061FEA4 0061FEA4 0061FEA4
  26. */
  27. //78 24910 12345678

成员共享具有瞬时共享性。

  1. typedef union _mix{
  2. char name[10];
  3. int age;
  4. }Mix;
  5. int main() {
  6. Mix m;
  7. strcpy(m.name,"assassin");
  8. printf("%s\n",m.name);
  9. printf("%d\n",m.age);
  10. m.age = 23;
  11. printf("%s\n",m.name);
  12. printf("%d\n",m.age);
  13. return 0;
  14. }
  15. /*
  16. assassin
  17. 1634956129 无意义的数字
  18. 无意义的数据
  19. 23
  20. */

共用体总结:

共用体变量的地址和它的各个成员的地址都是同一地址。

同一个内存段可以用来存放几种不同类型的成员,但是每一瞬间只能存放其中的一种,而不是同时存放几种。

共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后有的成员就是去作用。

共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

  1. typedef struct _staff{
  2. char name[30];
  3. char job;
  4. union{
  5. int grade;
  6. char position[50];
  7. }gOrp;
  8. }Staff;
  9. int main() {
  10. Staff sta[2];
  11. for(int i =0;i < 2;i++) {
  12. printf("name:");
  13. scanf("%s",sta[i].name);
  14. getcchar();//
  15. printf("job:");
  16. scanf("%c",&sta[i].jpb);
  17. if(sta[i].job == 't') {
  18. printf("position:");
  19. scanf("%s",sta[i].gOrp.position);
  20. }else {
  21. printf("grade:");
  22. scanf("%d",&sta[i].gOrp.grade);
  23. }
  24. }
  25. for(int i = 0;i < 2;i++) {
  26. printf("name:%s\n",sta[i].name);
  27. if(sta[i].job == 't') {
  28. printf("job:%s\n",sta[i].gOrp.position);
  29. }else {
  30. printf("job:%d\n",sta[i].gOrp.grade);
  31. }
  32. }
  33. }
  34. /*
  35. name:assassin
  36. job:t
  37. position:pro
  38. name:seafwg
  39. job:s
  40. grade:99
  41. name:assassin
  42. job:pro
  43. name:seafwg
  44. job:99
  45. */

小端序与大端序

union高地址放的小地址---小端序

union高地址放的大地址---大端序

用程序判断:大小端序:

  1. union _un{
  2. char c;
  3. int i;
  4. }un;
  5. int main() {
  6. un.i = 0x12345678;
  7. if(un.c == 0x12) {
  8. printf("大端序!\n");
  9. }else {
  10. printf("小端序!\n");
  11. }
  12. }
  13. //小端序!

枚举

枚举定义了一组整型常量的集合,目的可读性,语法跟结构体相同。

定义:

  1. enum 枚举类型
  2. {
  3. 常量列表;
  4. };
  1. //提供了一组常量的别名,以便程序的清晰可读
  2. enum Day{
  3. Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun
  4. //要是不赋值,从0开始,赋值后的成员依次加一。
  5. };
  6. int main() {
  7. enum Day day;
  8. printf("please input day!\n");
  9. scanf("%d",&day);
  10. switch(day) {
  11. case Mon:
  12. case Tue:
  13. case Wed:
  14. case Thu:
  15. case Fri:
  16. printf("workday!\n");
  17. break;
  18. case Sat:
  19. case Sun:
  20. printf("holiday!\n");
  21. break;
  22. }
  23. }

枚举与宏定义联系:

  1. #define Mon 1
  2. #define Tue 2
  3. #define Wed 3
  4. #define Thu 4
  5. #define Fri 5
  6. #define Sat 6
  7. #define Sun 7
  8. //<=> 类似与上述的宏定义,通常用enum来定义统一管理:
  9. enum Day{
  10. Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun
  11. };

常见应用:

  1. typedef enum _bool{
  2. False,True
  3. }Bool;
  4. int main() {
  5. Bool flag;
  6. flag = False;
  7. if(!flag) {
  8. printf("0\n");
  9. }else{
  10. printf("1\n");
  11. }
  12. }

C/C++(共用体与枚举)的更多相关文章

  1. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  2. __c语言__结构体、共用体、枚举__笔记

    2017-09-16 21:14:09 结构体,共用体,枚举 1.结构体 把不同的类型整合成一个有机的整体,以便于引用,这个类型就叫做结构体 1)结构体变量的定义方式(3种)和引用成员变量: 定义一个 ...

  3. C++结构、共用体、枚举

    一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...

  4. C++复合类型(结构,共用体,枚举)

    •结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明:   定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...

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

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

  6. c++结构体、共用体和枚举

    结构体类型 c++中的结构体成员既可以是数据,也可以是函数 c语言中定义结构体变量必须加struct(这也是很多时候和typedef),但是在c++里面,可以不加 结构体和类的不同在于,结构体中的变量 ...

  7. C++学习笔记(七)--共用体、枚举、typedef

    1.共用体 union其定义与结构体类似:union 类型名{ 成员表列;};声明变量的方法也类似: a. union 类型名{            b. union { c.类型名 变量名; 成员 ...

  8. C++程序设计之结构体,共用体,枚举和typedef

    [1]结构体的基本功 注意结构体里面可以有很多东西,可以结构体里面包含结构体 #include<iostream> using namespace std; struct Date { i ...

  9. C语言共用体、大小端、枚举

    1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...

随机推荐

  1. JS中的switch case

    function GetDepartmentName(type) { switch (type) { case DepartMentQian: alert($('#DepartMentQian').v ...

  2. codeforces 400 C Inna and Huge Candy Matrix【模拟】

    题意:给出一个矩形的三种操作,顺时针旋转,逆时针旋转,对称,给出原始坐标,再给出操作数,问最后得到的坐标 画一下模拟一下操作就可以找到规律了 #include<iostream> #inc ...

  3. 我的 Linux 主目录中的隐藏文件是干什么用的?

    作者: Alexander Fox 译者: LCTT MjSeven 在 Linux 系统中,你可能会在主目录中存储了大量文件和文件夹.但在这些文件之外,你知道你的主目录还附带了很多隐藏的文件和文件夹 ...

  4. 微星(MSI)新主板B150M MORTAR U盘装win7的坎坷经历

    新买的微星主板,热心的同事帮忙装好了win10,但是显卡驱动没装好,屏幕都快看瞎了眼,再者,楼主非常不喜欢win10的花哨,所以就装回了win7.下面来说一下我装win7的痛苦经历. 我是用UItra ...

  5. 使用 AutoHotKey 配合Win10分屏功能

    Win+tab键 建立新的虚拟桌面 使用笔记本电脑的触摸板,用四个手指滑的话就可以在虚拟桌面间切换 那么就映射一下, 要是能一键切换的话就相当于是个"老板键"了 1.安装AutoH ...

  6. 移动端(手机端)页面自适应解决方案—rem布局篇

    移动端(手机端)页面自适应解决方案-rem布局 假设设计妹妹给我们的设计稿尺寸为750 * 1340.结合网易.淘宝移动端首页html元素上的动态font-size属性.设计稿尺寸.前端与设计之间协作 ...

  7. 紫书 例题 10-12 UVa 1637(概率计算)

    以9元组来代表当前状态,每一元是每一堆剩下的牌数 枚举当前状态所有可以拿掉牌的情况,然后递归下去求 概率,当牌拿完的时候概率为1 那么这里的实现非常的秀,用到了vector来代表9元组 然后还用到了m ...

  8. P4287 [SHOI2011]双倍回文(回文树)

    题目描述 记字符串 w 的倒置为 w^R^ .例如 (abcd)^R^=dcba , (abba)^R^=abba . 对字符串x,如果 x 满足 x^R^=x ,则称之为回文:例如abba是一个回文 ...

  9. cocos2d-x 学习资源整理(持续更新...)

    生活像一把无情刻刀.改变了我们模样.以前我以为会亘古不变的东西,突然在一瞬间失去了信念... 假设你改变不了生活中患得患失的心情.那就试着让自己变得强大一点.由于能做到不以物喜不以己悲都是建立在强大的 ...

  10. HDU Victor and World (最短路+状态压缩)

    题目链接:传送门 题意: n个城市m条路.刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值. 分析: ​​+n​2​​∗2​n​​). 转自Bestcode. 以下说说我的状态转移,首先 ...