共用(Union)与枚举(Enum)

共同体

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

定义:

union unionName{
成员列表;
};

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

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

typedef struct _structTest{
char a;
short b;
int c;
}MyStruct;
typedef union _unionTest{
char a;
short b;
int c;
}MyUnion;
int main() {
MyStruct s;
MyUnion u;
printf("sizeof(struct) = %d sizeof(union) = %d\n",sizeof(MyStruct),sizeof(MyUnion)); printf("%p %p %p\n",&s.a,&s.b,&s.c);
printf("%p %p %p\n",&u.a,&u.b,&u.c); //MyUnion u = {0x123456789};//这样初始化只初始化第一个成员
u.c = 12345678;
printf("%d %d %d\n",u.a,u.b,u.c); return 0;
}
//sizeof(struct) = 8 sizeof(union) = 4
/*
0061FEA8 0061FEAA 0061FEAC
0061FEA4 0061FEA4 0061FEA4
*/
//78 24910 12345678

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

typedef union _mix{
char name[10];
int age;
}Mix;
int main() {
Mix m;
strcpy(m.name,"assassin");
printf("%s\n",m.name);
printf("%d\n",m.age); m.age = 23;
printf("%s\n",m.name);
printf("%d\n",m.age); return 0;
}
/*
assassin
1634956129 无意义的数字
无意义的数据
23
*/

共用体总结:

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

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

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

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

typedef struct _staff{
char name[30];
char job;
union{
int grade;
char position[50];
}gOrp;
}Staff;
int main() {
Staff sta[2];
for(int i =0;i < 2;i++) {
printf("name:");
scanf("%s",sta[i].name);
getcchar();//
printf("job:");
scanf("%c",&sta[i].jpb);
if(sta[i].job == 't') {
printf("position:");
scanf("%s",sta[i].gOrp.position);
}else {
printf("grade:");
scanf("%d",&sta[i].gOrp.grade);
}
}
for(int i = 0;i < 2;i++) {
printf("name:%s\n",sta[i].name);
if(sta[i].job == 't') {
printf("job:%s\n",sta[i].gOrp.position);
}else {
printf("job:%d\n",sta[i].gOrp.grade);
}
} } /*
name:assassin
job:t
position:pro
name:seafwg
job:s
grade:99
name:assassin
job:pro
name:seafwg
job:99
*/

小端序与大端序

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

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

用程序判断:大小端序:

union _un{
char c;
int i;
}un;
int main() {
un.i = 0x12345678;
if(un.c == 0x12) {
printf("大端序!\n");
}else {
printf("小端序!\n");
}
}
//小端序!

枚举

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

定义:

enum 枚举类型
{
常量列表;
};
//提供了一组常量的别名,以便程序的清晰可读
enum Day{
Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun
//要是不赋值,从0开始,赋值后的成员依次加一。
};
int main() {
enum Day day;
printf("please input day!\n");
scanf("%d",&day);
switch(day) {
case Mon:
case Tue:
case Wed:
case Thu:
case Fri:
printf("workday!\n");
break;
case Sat:
case Sun:
printf("holiday!\n");
break;
}
}

枚举与宏定义联系:

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

常见应用:

typedef enum _bool{
False,True
}Bool;
int main() {
Bool flag;
flag = False;
if(!flag) {
printf("0\n");
}else{
printf("1\n");
}
}

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. UVa 208 Firetruck【回溯】

    题意:给出一个n个节点的无向图,以及某个节点k,按照字典序从小到大输出从节点1到节点k的所有路径 看的题解 http://blog.csdn.net/hcbbt/article/details/975 ...

  2. [HEOI2012]旅行问题 AC 自动机

    题意: 求两个字符串的最长公共后缀,使得该后缀是某个字符串的前缀. 题解: 直接利用 $fail$ 指针的定义即可. 相当于求自动机上两点的 LCA,好像倍增可以,怕炸空间就老老实实写树剖吧. Cod ...

  3. HTML5的核心内容

    开发者可以放心地使用html5的理由 兼容性.HTML5在老版本的浏览器可以正常运行,同时支持HTML5的新浏览器也能正常运行HTML4,用HTML4创建出来的网站不是必须全部重建的. 实用性.HTM ...

  4. bzoj 1088 [SCOI2005] 扫雷

    SCOI2005 扫雷 一道很有趣的(水)题 “这道题有四种解法,你知道么” 给你矩阵的第二列的数字,求出第一列雷有多少种可能的摆法. 不懂扫雷规则的自行按win+R然后输入winmine 思考过后我 ...

  5. MPI并行计算模拟N体问题

    实验内容 N体问题是指找出已知初始位置.速度和质量的多个物体在经典力学情况下的后续运动.在本次实验中,你需要模拟N个物体在二维空间中的运动情况.通过计算每两个物体之间的相互作用力,可以确定下一个时间周 ...

  6. pip命令使用方法 与 错误处理

    这里把学习到的pip命令写一个汇总,方便想不起来时使用 通过cmd输入pip可以显示提示信息,中文翻译如下: 1)显示某个包的信息 pip show selenium #显示selenium模块的信息 ...

  7. Unity shader 代码高亮+提示

    Shader Unity Support This is Unity CG Shaders Support. It has code completion support and uses C/C++ ...

  8. [Teamcenter 2007 开发实战] 调用web service

    前言 在TC的服务端开发中, 能够使用gsoap 来调用web service. 怎样使用 gsoap  , 參考 gsoap 实现 C/C++ 调用web service 接下来介绍怎样在TC中进行 ...

  9. Service绑定模式

    Service绑定模式      使用绑定的Service能够实现组件与Service的通信. 组件与被绑定的Service能够不归属于同一个应用程序.因此通过绑定Service能够实现进程间通信. ...

  10. [python]pip坏了怎么办?

    今天,给一位新同事配置pip,用get-pip.py安装之后.出现错误: raise DistributionNotFound(req)  # XXX put more info here pkg_r ...