做受视频播放网站,网站集约化建设工作总结,个人工作室营业执照,新区网站建设在之前我们已经深入学习了自定义类型中的结构体类型 #xff0c;了解了结构体当中的内存对齐#xff0c;位段等知识#xff0c;接下来在本篇中将继续学习剩下的两个自定义类型#xff1a;枚举类型与联合体类型#xff0c;一起加油#xff01;#xff01; 1.枚举类型
…在之前我们已经深入学习了自定义类型中的结构体类型 了解了结构体当中的内存对齐位段等知识接下来在本篇中将继续学习剩下的两个自定义类型枚举类型与联合体类型一起加油 1.枚举类型
1.1枚举类型的定义与使用方法
枚举的字面意思就是一一列举而在c语言中是用枚举来声明枚举类型的在这当中用到的关键字是enum 一周的星期⼀到星期日是有限的7天可以⼀⼀列举 性别有男、女、保密也可以⼀⼀列举 月份有12个月也可以⼀⼀列举 三原色也是可以意义列举 这些数据的表示就可以使用枚举了。 以下这些例子就是使用了枚举
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};enum Sex//性别
{
MALE,
FEMALE,
SECRET
}enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
这以上当中的enum Day enum Sexenum Color都是枚举类型 而在括号内的就为枚举常量 这些枚举常量在各个枚举类型当中默认值都是从0开始的后依次递增 enum Sex//性别
{MALE,FEMALE,SECRET
};int main()
{enum Sex s1 MALE;enum Sex s2 FEMALE;enum Sex s3 SECRET;printf(%d %d %d, s1,s2,s3);return 0;
} 以上代码输出结果如下 在声明枚举类型的时候也可以赋初值 enum Sex//性别
{MALE,FEMALE12,SECRET13
};int main()
{enum Sex s1 MALE;enum Sex s2 FEMALE;enum Sex s3 SECRET;printf(%d %d %d, s1,s2,s3);return 0;
} 以上代码输出结果如下 1.2枚举类型的优点
我们可以使用#define 定义常量为什么非要使用枚举枚举的优点1. 增加代码的可读性和可维护性2. 和#define定义的标识符比较枚举有类型检查更加严谨。3. 便于调试预处理阶段会删除 #define 定义的符号4. 使用方便一次可以定义多个常量5. 枚举常量是遵循作用域规则的枚举声明在函数内只能在函数内使用 在以上当中提到的枚举有类型检查是指在c的环境下不能拿整数给枚举变量赋值 例如当我们将源文件改为.cpp后缀时以下代码就会报错 例如在以下代码中 enum Sex//性别
{MALE,FEMALE,SECRET
};也可以用define来定义常量,当这种方式相比枚举类型就使得可读性下降了在此的define定义的就没有明确的意义且定义红的作用域是整个工程如果我们只是想在一部分使用就无法实现 #define MALE 0
#define FEMALE 1
#define SECRET 2 2.联合体类型
2.1 联合体类型的声明
像结构体⼀样联合体也是由一个或者多个成员构成这些成员可以不同的类型。 例如以下代码就是一个联合体的声明
union Un
{
char c;
int i;
};
2.2联合体类型的特点
#include stdio.h
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un {0};
//计算连个变量的⼤⼩
printf(%d\n, sizeof(un));
return 0;
}
在以上代码输出结果你认为是什么呢 其实输出结果是4表示这个联合体大小为4字节这是为什么呢要解释原因接下来就要了解联合体的特点联合的成员是共用同一块内存空间的这样⼀个联合变量的大小至少是最大成员的大小因为联合至少得有能力保存最大的那个成员因此联合体也叫共用体我们来通过以下两段代码来进一步了解联合体的特点 第一段代码 #include stdio.h
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un {0};
// 下⾯输出的结果是⼀样的吗
printf(%p\n, (un.i));
printf(%p\n, (un.c));
printf(%p\n, un);
return 0;
} 代码输出结果如下 通过以上输出的结果可以看出在以上联合体内的两个成员变量地址都一样 第二段代码 #include stdio.h
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un {0};
un.i 0x11223344;
un.c 0x55;
printf(%x\n, un.i);
return 0;
} 我们来通过调试查看以上代码的内存内数值的变化 代码1输出的三个地址一模一样代码2的输出我们发现将i的第4个字节的内容修改为55了。 我们仔细分析就可以画出un的内存布局图。
2.3联合体大小的计算
在以上我们知道了联合体的大小至少是最大成员的大小其实在计算联合体大小时还有一个要求 当最大成员大小不是最大对齐数的整数倍的时候就对齐到最大对齐数的整数倍。
#include stdio.h
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下⾯输出的结果是什么
printf(%d\n, sizeof(union Un1));
printf(%d\n, sizeof(union Un2));
return 0;
} 在以上代码中的Un1内的char c[5] 可以看作5个char 变量因为c[5]该成员的对齐数为1大小为5字节,所以联合体Un1大小至少为5字节。又因为成员i的对齐数为4大小为4字节这时最大成员大小不是最大对齐数的整数倍就对齐到最大对齐数的整数倍。所以联合体大小就为4的倍数也就为8字节
在以上代码中的Un2内的是 c[7] 可以看作7个short 变量因为c[7]该成员的对齐数为2大小为14字节,所以联合体Un1大小至少为14字节。又因为成员i的对齐数为4大小为4字节这时最大成员大小不是最大对齐数的整数倍就对齐到最大对齐数的整数倍。所以联合体大小就为4的倍数也就为16字节 2.4 联合的练习
练习一
写⼀个程序使用联合体判断当前机器是大端还是小端
#include stdio.h
int check_sys()
{
union
{
int i;
char c;
}un;
un.i 1;
return un.c;
}int main()
{
int ret check_sys();
if(ret 1)
{
printf(⼩端\n);
}
else
{
printf(⼤端\n);
}
return 0;
}
练习二
我们要搞⼀个活动要上线⼀个礼品兑换单礼品兑换单中有三种商品图书、杯子、衬衫。 每⼀种商品都有库存量、价格、商品类型和商品类型相关的其他信息。 图书书名、作者、页数杯⼦设计衬衫设计、可选颜色、可选尺⼨ 在该题你可能会像以下一样直接使用结构体列出全部信息
struct gift_list
{
//公共属性
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
//特殊属性
char title[20];//书名
char author[20];//作者
int num_pages;//⻚数
char design[30];//设计
int colors;//颜⾊
int sizes;//尺⼨
};
但当这样设计时比如在描述图书时designcolorssizes这些变量就用不到了但是由于都在结构体内未使用还是会为它们开辟内存空间这就存在内存浪费 所以我们就可以把公共属性单独写出来剩余属于各种商品本身的属性使用联合体起来这样就可以介绍所需的内存空间⼀定程度上节省了内存。 struct gift_list
{
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
union {
struct
{
char title[20];//书名
char author[20];//作者
int num_pages;//⻚数
}book;
struct
{
char design[30];//设计
}mug;
struct
{
char design[30];//设计
int colors;//颜⾊
int sizes;//尺⼨
}shirt;
}item;
};
文章转载自: http://www.morning.lrprj.cn.gov.cn.lrprj.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn http://www.morning.yubkwd.cn.gov.cn.yubkwd.cn http://www.morning.wlqbr.cn.gov.cn.wlqbr.cn http://www.morning.clbzy.cn.gov.cn.clbzy.cn http://www.morning.skkmz.cn.gov.cn.skkmz.cn http://www.morning.yldgw.cn.gov.cn.yldgw.cn http://www.morning.rzpkt.cn.gov.cn.rzpkt.cn http://www.morning.rdxnt.cn.gov.cn.rdxnt.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.dpsgq.cn.gov.cn.dpsgq.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.nrtpb.cn.gov.cn.nrtpb.cn http://www.morning.nzqqd.cn.gov.cn.nzqqd.cn http://www.morning.lrzst.cn.gov.cn.lrzst.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.swsrb.cn.gov.cn.swsrb.cn http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.spfh.cn.gov.cn.spfh.cn http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn http://www.morning.mtcnl.cn.gov.cn.mtcnl.cn http://www.morning.nldsd.cn.gov.cn.nldsd.cn http://www.morning.ypzr.cn.gov.cn.ypzr.cn http://www.morning.xcnwf.cn.gov.cn.xcnwf.cn http://www.morning.khyqt.cn.gov.cn.khyqt.cn http://www.morning.qyjqj.cn.gov.cn.qyjqj.cn http://www.morning.hrpmt.cn.gov.cn.hrpmt.cn http://www.morning.mxxsq.cn.gov.cn.mxxsq.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.kgnrh.cn.gov.cn.kgnrh.cn http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn http://www.morning.osshjj.cn.gov.cn.osshjj.cn http://www.morning.crhd.cn.gov.cn.crhd.cn http://www.morning.ltywr.cn.gov.cn.ltywr.cn http://www.morning.hdscx.cn.gov.cn.hdscx.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.zrkws.cn.gov.cn.zrkws.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn http://www.morning.bmhc.cn.gov.cn.bmhc.cn http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn http://www.morning.gccdr.cn.gov.cn.gccdr.cn http://www.morning.mdpkf.cn.gov.cn.mdpkf.cn http://www.morning.mcjyair.com.gov.cn.mcjyair.com http://www.morning.zcckq.cn.gov.cn.zcckq.cn http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.wjplr.cn.gov.cn.wjplr.cn http://www.morning.pfgln.cn.gov.cn.pfgln.cn http://www.morning.sgfgz.cn.gov.cn.sgfgz.cn http://www.morning.lhrwy.cn.gov.cn.lhrwy.cn http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn http://www.morning.rcqyk.cn.gov.cn.rcqyk.cn http://www.morning.dmtbs.cn.gov.cn.dmtbs.cn http://www.morning.prgdy.cn.gov.cn.prgdy.cn http://www.morning.fwmln.cn.gov.cn.fwmln.cn http://www.morning.jhqcr.cn.gov.cn.jhqcr.cn http://www.morning.pnjsl.cn.gov.cn.pnjsl.cn http://www.morning.cjmmt.cn.gov.cn.cjmmt.cn http://www.morning.wtrjq.cn.gov.cn.wtrjq.cn http://www.morning.lqlc.cn.gov.cn.lqlc.cn http://www.morning.przc.cn.gov.cn.przc.cn http://www.morning.dppfh.cn.gov.cn.dppfh.cn http://www.morning.mprpx.cn.gov.cn.mprpx.cn http://www.morning.rfkyb.cn.gov.cn.rfkyb.cn http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn http://www.morning.bxrqf.cn.gov.cn.bxrqf.cn http://www.morning.tqjwx.cn.gov.cn.tqjwx.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.pjyrl.cn.gov.cn.pjyrl.cn http://www.morning.mwjwy.cn.gov.cn.mwjwy.cn http://www.morning.rwlns.cn.gov.cn.rwlns.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.jtwck.cn.gov.cn.jtwck.cn http://www.morning.htjwz.cn.gov.cn.htjwz.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn