联合体与枚举
- 联合体
- 枚举问题
联合体
联合体也是由一个或多个成员构成的数据类型,它最大的特点是只为最大的一个成员开辟空间,其他成员共用这个空间,这个东西也叫共用体!!!
union Un
{char c;int i;
};int main()
{union Un un = { 0 };un.c = 0x01;//先为最大的成员开辟空间un.i = 0x11223344;printf("%x\n", un.c);printf("%x\n", un.i);printf("%d\n", sizeof(un));return 0;
}
**联合体的特点:
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。
**联合体内存分布规则
*联合体大小至少是最大成员的大小!
*当最大成员大小不是最大对齐数整数倍的时候时,要对齐到最大对齐数的整数倍!!!
union Un1
{char c[5];int i;
};union Un2
{short c[7];int i;
};int main()
{printf("%zd\n", sizeof(union Un1));printf("%zd\n", sizeof(union Un2));return 0;
}
解析:第一个联合体最大的一个占5个字节,它不是4的倍数,因此成8个字节,浪费三个字节!!!
第二个联合体的最大一个占14个字节,不是4个倍数,因此浪费2个字节,成16个字节,成为4的倍数!!!
**判断大小端问题!!!
//判断大小端问题int CheckSys()
{int a = 0x00000001; // 00 00 00 01return (*(char*)&a);
}int main()
{if (CheckSys() == 1){printf("小段存储模式\n");}else {printf("大端存储模式\n");}return 0;
}
/
//判断大小端,运用联合体的内存分布问题,巧妙地运用了联合体!!!
union
{int i;char c;
}un;int main()
{un.i = 0x11223344;if (un.c == 0x44){printf("小段存储模式\n");}else{printf("大段存储模式\n");}return 0;
}
枚举问题
1.枚举就是一一列举的问题!!!
//枚举一一列举
enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Sex
{MALE = 1,FEMALE,SECRET
};enum Color
{RED,GREEN,BLUE
};int main()
{printf("%d\n", Mon);printf("%d\n", Fri);printf("%d\n", MALE);return 0;
}
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值.
2.枚举类型的优点
/
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤
3.枚举类型的使用
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
enum Color color = RED;
printf(“%d\n”, color);
return 0;
}
------------------------------------------
完结!!!