枚举和共用体

枚举

枚举就是一一列举
比如:一周有7天、性别有男女、一个月有30天,都可以一一列举

枚举类型的定义

123456789101112
#include <stdio.h>enum Sex//枚举类型{    Male,    Female,    Secret//枚举的可能取值 - 常量};int main() {    enum Sex s = Male;//这里只能赋Male、Female、Secret规定的三个值    printf("%d,%d,%d",Male,Female,Secret);//打印的结果是0,1,2    return 0;}

枚举的优点

枚举相比#define的优点有哪些?

  • 增加代码的可读性和可维护性
  • 和#define定义的标识符比较,枚举有类型检查,更严谨。(define只是替换)
  • 防止命名污染
  • 便于调试
  • 使用方便,一次可以定义多个变量

联合(共用体)

联合也是一种特殊的自定义类型,这种类型定义的变量也包含了一系列的成员,特征是这些成员共用一块空间(所以联合也叫共用体)

联合类型的定义

12345678910111213141516
#include <stdio.h>union Un{    char c;    int i;}; int main(){    union Un u;    printf("%d\n",sizeof(u));//4    printf("%p\n",&u);//0x16fdff1c8    printf("%p\n",&(u.c));//0x16fdff1c8    printf("%p\n",&(u.i));//0x16fdff1c8    return 0;}

上面可以知道,u这个联合变量,占4字节,并且u里面的int和char类型的地址是一样的。

联合的特点

联合的成员共用一块内存空间,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有保存那个成员的能力)

判断当前计算机的大小端存储:

参考:大小端介绍

123456789101112131415161718192021222324252627
#include <stdio.h>int check_sys(){    union Un    {        char c;        int i;    }u;    u.i = 1;    //返回1,小端    //返回0,大端    return u.c;}int main(){    int a = 1;    int ret = check_sys();    if (1 == ret)    {        printf("小端\n");    }    else    {        printf("大端\n");    }    return 0;}

联合大小的计算

  • 联合大小最小是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,对齐到最大对齐数的整数倍。
    12345678910111213
    #include <stdio.h>union Un{    int a;    char arr[5];}; int main(){    union Un u;    printf("%d\n",sizeof(u));//8    return 0;}
    u的大小是8,是由于字符型的数组arr占5个字节,浪费3字节,对齐到8字节,是最大的成员,占8字节。
🔍 ×