C/C++(共用体与枚举)
共用(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++(共用体与枚举)的更多相关文章
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- __c语言__结构体、共用体、枚举__笔记
2017-09-16 21:14:09 结构体,共用体,枚举 1.结构体 把不同的类型整合成一个有机的整体,以便于引用,这个类型就叫做结构体 1)结构体变量的定义方式(3种)和引用成员变量: 定义一个 ...
- C++结构、共用体、枚举
一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...
- C++复合类型(结构,共用体,枚举)
•结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明: 定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...
- 07.C语言:结构体、共用体、枚举
一.结构体 是一种复合的数据类型,由多个不同类型的数据(为结构体的成员)组成的集合. 在c语言中没有给出结构体这种类型具体的形式(名称),但是给出类定义该结构体类型的方法(格式). 在使用结构体类型时 ...
- c++结构体、共用体和枚举
结构体类型 c++中的结构体成员既可以是数据,也可以是函数 c语言中定义结构体变量必须加struct(这也是很多时候和typedef),但是在c++里面,可以不加 结构体和类的不同在于,结构体中的变量 ...
- C++学习笔记(七)--共用体、枚举、typedef
1.共用体 union其定义与结构体类似:union 类型名{ 成员表列;};声明变量的方法也类似: a. union 类型名{ b. union { c.类型名 变量名; 成员 ...
- C++程序设计之结构体,共用体,枚举和typedef
[1]结构体的基本功 注意结构体里面可以有很多东西,可以结构体里面包含结构体 #include<iostream> using namespace std; struct Date { i ...
- C语言共用体、大小端、枚举
1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...
随机推荐
- ES6中includes、startsWith、endsWith
es6新增includes:返回布尔值,表示是否找到字符串.startsWith:返回布尔值,表示字符串是否在源字符串的头部位置.endsWith:返回布尔值,表示参数字符串是否在源字符串尾部. va ...
- grvphviz && dot脚本语言
安装graphviz 可去官网下载http://www.graphviz.org/download/下载之后按步骤安装 打开编辑器,创建*.dot文件,编辑dot脚本代码,保存. D:\>dot ...
- vue打包后显示空白正确处理方法
vue打包后显示空白正确处理方法是 1.找到配置文件(js与css加载不上) 修改 这样打包处理可以打开但是页面样式会找不到 2.修改(针对css中的图片加载不上) 找到对应的位置加上publicPa ...
- MySQL服务正在启动或停止中,请稍候片刻后再试一次【解决方案】
相信有些小伙伴在使用数据库的过程中会经常频繁的启动和停止MySQL服务,有时候会出现“服务正在启动或停止中,请稍候片刻后再试一次.”这样的提示,如下图所示. 于是乎想办法去解决这个问题,但是发现连强制 ...
- 关于PHPExcel上传Excel单元格富文本和时间类型读取数据问题
当用PHPExcel做Excel上传文件读取数据时,print_r出来的数据,竟然发现其中有几个单元格返回的是PHPExcel富文本对象,而且时间类型的单元格返回的是一个不是时间戳的五位数.就像下图那 ...
- TCP学习前的准备——可靠数据传输协议
由于传输层所依赖的网络层是不可靠的,通过逐渐考虑实际情况不断引入新技术来实现可靠数据传输. 完全可信的信道 有比特差错的信道 新的协议功能: 1. 差错检测:检验和 2. 接收方反馈:序号 ...
- Unity 编辑器学习(二)之 全局光照(GI)
光影流年,花影阡陌.光与影交织的岁月教育我们,不会使用光照的程序员不是个好美术. 一.概述 点击 Window > Lighting > Settings 会弹出Lighting窗口,这个 ...
- 【Codeforces Round #423 (Div. 2) B】Black Square
[Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...
- Qt之图形(绘制文本)
简述 前面我们讲解了Qt图形的基本绘制,其中包括: 绘制文本.直线.直线.矩形.弧线.椭圆.多边形.图片,以及其它一些高级用法,比如:渐变.转换等. 本节我们来详细讲解文字的绘制.主要通过QPaint ...
- python list的+,+=,append,extend
面试题之中的一个. def func1(p): p = p + [1] def func2(p): p += [1] p1 = [1,2,3] p2 = [1,2,3] func1(p1) func2 ...