目录
位段
位段的声明
和结构体的声明极其类似不同点
(1),位段的成员必须是int ,unsigned, int 或 signed int,char。
(2),位段的成员名后边有一个冒号和一个数字。
比如:
struct A { int _a : 2; int _b : 5; int _c : 10; int _d : 30; };
位段的内存分配
1.位段的成员可以是int ,unsigned, int ,signed int或者是 char(属于是整形家族)类型。
2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟。
3.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序因避免使用。
eg:
struct A { int _a : 2; int _b : 5; int _c : 10; int _d : 30; }; int main() { struct A s; printf("%d", sizeof(s)); return 0; }
输出:
8
位段的意义
位段存在的意义在于节省空间
若换为结构体,上面程序将占用16个字节。
位段的跨平台问题
1.int 位段被当成有符号数还是无符号数是不确定的。
2.位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问 题。
3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的 位还是利用,这是不确定的。
总结
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
枚举
枚举就是一一列举。
枚举的定义
enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。
enum Day { //枚举的可能取值————枚举常量 Mon, //0 Tues, //1 Wed, //2 Thur, //3 Fri, //4 Sat, //5 Sun //6 };
枚举常量在定义时,会自动给它赋上初始值,从零开始,也可以在定义时自己给它赋值,赋值后在调用时是无法更改给它赋的值的。
枚举的初始化
enum Sex { //枚举的可能取值 MALE, FEMALE, SECRET }; int main() { enum Sex n = MALE; enum Sex m = FEMALE; return 0; }
枚举的优点
1.便于调试。
2.方便使用,一次可以定义多个常量。
3.增加代码的可读性和可维护性。
4.和#define定义的标识符比,枚举有类型检查,更加严谨。
5.防止命名污染(封装)。
总结
注意:
(1)enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。
(2)枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。但注意命名时要提高程序的可读性。枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
(3)枚举数据表的值都是整数。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(4)可以在定义类型时对枚举常量初始化。
(5)枚举类型可以进行比较。
(6)枚举常量不是字符串,不能用%s方式输出字符串。
(7)枚举型是预处理指令#define的替代
联合(共用体)
联合的定义
“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。
eg:
union Un { char c; int i; };
共用体的内存分配:
共用同一块空间
union Un { char c; int i; }; int main() { union Un c; printf("%d",sizeof(c) ); }
输出结果:
4
与结构体的区别
联合的声明和结构与结构体类似,但是本质不同。
联合的所有成员引用的是内存中的相同位置。当你想在不同时刻把不同的东西存储于同一位置时,就可以使用联合。
构体中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
联合体大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的的整数倍时,就要对齐到最大对齐数的整数倍。
联合体的缺点
联合体中的成员变量不能同时使用。