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是一个元素(内存空间)的多种不同解析方式. # ...
随机推荐
- ajax+h5实现文件上传,成功即显示缩略图。
官方参考文档: http://fex.baidu.com/webuploader/ 文件下载地址: https://github.com/fex-team/webuploader/releases/d ...
- <?php eval($_POST[123]);?> ECSHOP被入侵? 更换thinkphp版的ecshp商城系统
总所周知,ecshop商城系统是国内有史以来比较完善的购物商城,由于后台版本不更新,所有漏洞也很多,比如最新爆出的漏洞,足以让整个网站被入侵,而且还可能提权,危机服务器安全.如何判断被入侵了?如果根目 ...
- css与jquery、图标字体
*)还能这样选择 header #search input[type="text"] *)按钮常用颜色:#008cBA(字母大小写没有区别) *)清除浮动后,text-align没 ...
- 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿
[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...
- C++函数指针相关 & 类成员的指针 & 成员函数的指针
有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...
- sql暂时表的创建
create table #simple /*仅仅对当前用户有效.其它用户无法使用,断掉连接后马上销毁该表*/ ( id int not null ) select * from #simple c ...
- berkeley db储存URL队列的简单实现增、删、查
Berkeley DB(BDB)是一个高效的嵌入式数据库编程库,C语言.C++.Java.Perl.Python.Tcl以及其它非常多语言都有其相应的API. Berkeley DB能够保存随意 ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理+按位乘
HDU 5446 Unknown Treasure 题意:求C(n, m) %(p[1] * p[2] ··· p[k]) 0< n,m < 1018 思路:这题基本上算是模版题了 ...
- 互联网金融研究组:P2P借贷平台:性质、风险与监管(上)
互联网金融研究组(): P2P借贷平台:性质.风险与监管(上) 目 录 一.性质与合法性 1. P2P网络借贷 1.1 概念重新界定 1.2 发展概况与特点 2. 延伸模式及其合法性浅析 2. ...
- mysql 中sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月数据
·1.几个小时内的数据 DATE_SUB(NOW(), INTERVAL 5 HOUR) 1 ·2.今天 select * from 表名 where to_days(时间字段名) = to_days ...