上篇文章介绍了结构体相关的内容,大家可以点击链接进行浏览:c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)-CSDN博客
各种源码大家可以去我的gitee主页进行查找:唔姆 (Nerowlp) - Gitee.com
今天要介绍的是:枚举与联合的相关内容
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
上述代码定义的 enum Sex , enum Color 都是枚举类型。undefined { } 中的内容是枚举类型的可能取值,也叫 枚举常量undefined
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
默认值便是从零开始:
也可以自己进行主动赋值:
大家也可以猜一下这段代码输出什么:
enum Sex
{
MALE,
FEMALE=8,
SECRET
};
int main()
{
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
答案揭晓:
enum Color//颜色
{
RED=3,
GREEN=2,
BLUE=4
};
enum Color cl = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
union A //定义一个共用体
{
char a;
int b;
};
int main()
{
union A a; //创建一个共用体变量
printf("%p\n", &a);
printf("%p\n", &(a.a));
printf("%p\n", &(a.b));
return 0;
}
可以看到三个地址是一样的:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小, 至少是最大成员的大小 (因为联合至少得有能力保存最大的那个成员)
union A //定义一个共用体
{
char a;
int b;
};
int judge()
{
union A u;
u.b = 1;
return u.a;
}
int main()
{
int a = judge();
if (a == 1)
{
printf("是小端");
}
else
{
printf("是大端");
}
return 0;
}
众所周知vs2019 是小端储存:
union U1
{
char arr[5]; //5个字节 对齐数是1
int a; //4个字节 对齐数是4
};
int main()
{
printf("%d", sizeof(union U1));//如果只是最大的成员变量的大小,那应当输出5
return 0;
}
但结果是8
好啦,这次枚举,联合(共用体)就讲解到这里。下一次会继续记录我学习的过程。希望能对大家有所帮助。