建筑人才网一砖一瓦,百度关键词优化推广,asp.net实用网站开发,建筑工程网上竣工验收入口✨个人主页#xff1a; 熬夜学编程的小林
#x1f497;系列专栏#xff1a; 【C语言详解】 【数据结构详解】
目录 1、联合体
1.1、联合体类型的声明
1.2、联合体的特点
1.3、相同成员的结构体和联合体对比
1.4、联合体大小的计算
1.5、联合的⼀个练习
2、枚举类型 …
✨个人主页 熬夜学编程的小林
系列专栏 【C语言详解】 【数据结构详解】
目录 1、联合体
1.1、联合体类型的声明
1.2、联合体的特点
1.3、相同成员的结构体和联合体对比
1.4、联合体大小的计算
1.5、联合的⼀个练习
2、枚举类型
2.1、枚举类型的声明
2.2、枚举类型的优点
2.3、枚举类型的使用
总结 1、联合体 1.1、联合体类型的声明 像结构体⼀样联合体也是由⼀个或者多个成员构成这些成员可以不同的类型。 但是编译器 只为最大的成员分配足够的内存空间 。联合体的特点是 所有成员共用同⼀块内存空间。 所以联合体也叫 共用体 。 给联合体其中⼀个成员赋值其他成员的值也跟着变化。 #include stdio.h
//联合类型的声明
union Un
{char c;int i;
};int main()
{//联合体局部变量的定义union Un un {0};//计算联合体变量的大小printf(%d\n, sizeof(un));return 0;
} 那现在uu来思考一个问题上面的联合体变量un的大小是多少 输出的结果 为什么是4呢 计算联合体的大小跟结构体类似需要知道联合体的内存布局才能准确计算出大小因此我们先学习关于联合体的相关知识再来详细讲解计算大小问题。 1.2、联合体的特点 联合的成员是共⽤同⼀块内存空间的这样⼀个联合变量的大小至少是最大成员的大小因为联合至少得有能力保存最大的那个成员。 //代码1
#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;
} 通过上述代码我们可以知道联合体的每个成员地址和联合体的首地址是相同的。 //代码2
#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的内存布局图。 1.3、相同成员的结构体和联合体对比 我们再对比⼀下相同成员的结构体和联合体的内存布局情况。 struct S
{char c;int i;
};
struct S s {0}; union Un
{char c;int i;
};
union Un un {0}; 1.4、联合体大小的计算 • 联合的大小至少是最大成员的大小。 • 当最大成员大小不是最大对齐数的整数倍的时候就要对齐到最大对齐数的整数倍。 注意对齐数跟结构体说描述的对齐数是相同的。 #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;
} 使用联合体是可以节省空间的举例 比如我们要搞⼀个活动要上线⼀个礼品兑换单礼品兑换单中有三种商品图书、杯⼦、衬衫。 每⼀种商品都有库存量、价格、商品类型和商品类型相关的其他信息。 图书书名、作者、页数 杯⼦设计 衬衫设计、可选颜色、可选尺寸 那我们不耐心思考直接写出⼀下结构 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;//尺⼨
}; 上述的结构其实设计的很简单用起来也方便但是结构的设计中包含了所有礼品的各种属性这样使得结构体的大小就会偏大比较浪费内存。因为对于礼品兑换单中的商品来说只有部分属性信息是常用的。 比如 商品是图书就不需要design、colors、sizes。 所以我们就可以把公共属性单独写出来剩余属于各种商品本身的属性使用联合体起来这样就可以介绍所需的内存空间⼀定程度上节省了内存。 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;
}; 1.5、联合的⼀个练习 写⼀个程序判断当前机器是大端还是小端 int check_sys()
{union//匿名联合体{int i;char c;}un;//联合体变量un.i 1;//16进制为00 00 00 01 内存中存储为01 00 00 00 (小端)//下图表示的是内存中的存储return un.c;//返回1是⼩端返回0是⼤端
} 注联合体的定义初始化以及匿名联合体和结构体方式一致此处就不详细讲解了。可以去看上两弹的结构体创建定义初始化以及匿名结构体。 2、枚举类型 2.1、枚举类型的声明 枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。 比如我们现实生活中 ⼀周的星期⼀到星期日是有限的7天可以⼀⼀列举 性别有男、女、保密也可以⼀⼀列举 月份有12个月也可以⼀⼀列举 三原色也是可以意义列举 这些数据的表示就可以使用枚举了。 enum Day//星期
{Mon,//0Tues,//1Wed,//2Thur,Fri,Sat,Sun
};
enum Sex//性别
{MALE,//0FEMALE,//1SECRET//2
}
enum Color//颜⾊
{RED,//0GREEN,//1BLUE//2
}; 以上定义的 enum Day enum Sex enum Color 都是枚举类型。 {}中的内容是枚举类型的可能取值也叫 枚举常量 。 这些可能取值都是有值的 默认从0开始依次递增1 当然在声明枚举类型的时候也可以赋初值。 enum Color//颜⾊
{RED2,GREEN4,BLUE8
}; 2.2、枚举类型的优点 为什么使用枚举 我们可以使用 #define 定义常量为什么用要使用枚举 枚举的优点 1. 增加代码的可读性和可维护性。 2. 和#define定义的标识符比较枚举有类型检查更加严谨。 3. 便于调试预处理阶段会删除 #define 定义的符号。 4. 使用方便⼀次可以定义多个常量。 5. 枚举常量是遵循作用域规则的枚举声明在函数内只能在函数内使用。 2.3、枚举类型的使用 enum Color//颜⾊
{RED1,GREEN2,BLUE4
};
enum Color clr GREEN;//使⽤枚举常量给枚举变量赋值 那是否可以拿整数给枚举变量赋值呢在C语言中是可以的但是在C是不行的C的类型检查比较严格。 总结 本篇博客就结束啦谢谢大家的观看如果公主少年们有好的建议可以留言喔谢谢大家啦