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是一个元素(内存空间)的多种不同解析方式. # ...
随机推荐
- IDEA項目配置404
本人使用的版本是 Intellij IDEA 2017.1 最近刚学习使用 Intellij IDEA 开发项目,就遇到了坑爹的问题,部署一个简单的 ssh 项目,tomcat启动正常,没有任 ...
- ipad mini2 升级9.0.2后解锁白屏解决
解锁白屏是个什么现象?就是当你用手指滑动解锁后出现输入密码的界面后,1秒之内屏幕变白,中间一个黑色的苹果,几秒之后重新回到滑动解锁的界面.我出现这个现象不是因为升级了9.0.2,而是升级了9.0.2之 ...
- WIFI 测试和调试
WIFI测试和调试 本文将介绍如何使用 ASOP 中提供的工具测试和调试 WLAN 实现. 测试 为了测试 WLAN 框架,AOSP 提供了一系列单元测试.集成测试 (ACTS) 和 CTS 测试. ...
- CentOS6.9下sftp配置和scp用法
基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录). 1.如果只想让某些用户只能使用 sftp 操作文件, 而不能通过ssh进行服 ...
- 联想服务器thinkserver TS550 Raid5制作及winserver2012R2 安装过来
一. 联想服务器thinkserver TS550 Raid5制作 1.开机后按ctrl+i 进入raid配置模式 2.选择“1”配置所需Raid模式(这次配的是raid5) 3.按提示确认后退出 ...
- 高手过愚人节 Manancher模板题_双倍经验
Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...
- require(): open_basedir restriction in effect. File
新安装的 lnmp 环境,将项目放上报 require(): open_basedir restriction in effect. File 的错误! 错误日志显示,访问脚本不在 open_base ...
- vs2010和qt4.8.4配置
最近项目要求在vs中开发qt程序,安装过后发现代码每天提示功能.由于本人记忆力有限,特在网上收罗了些配置方法. vs安装目录采用默认,qt安装目录:C:\Qt\4.8.4vs 在系统环境变量新建QTD ...
- IIS集成和经典配置
检測到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式). 我们将ASP.NET程序从IIS6移植到IIS7,可能执行提示下面错误: HTTP 错误 500. ...
- 八款常用的 Python GUI 开发框架推荐
作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言. Python 的 UI 开发工具 ...