共用体又称为联合体,使用覆盖技术,几个变量相互覆盖,使得不同变量占用同一段内存的结构

图片来源:B站 up 织码匠
定义和初始化
# include <stdio.h>
union data
{
char a;
int b;
double c;
};
//注意:定义的结构基本和结构体类似!
int main(void)
{
union data var1;
var1.b = 3;
printf("%d\n",var1.b);
return 0;
}
可以看到无论是定义还是引用都和结构体非常类似,那么它们之间有什么区别呢?
与结构体的区别 ① 在某一个时刻只能使用一个成员来存储有效数据 ② 等第二次赋值时,即使是不同数据类型,也会覆盖掉前一次的值,因为他们首地址时一样的。
共用体变量开头的地址必须 被其最宽的基本类型成员的大小所整除,共用体总长度必须大于等于其最宽成员的长度。
把一个事物所有可能的取值一一列举出来,变量的值仅限于列举出来的值的范围内。
假如存放一个星期所有的天数,原来可以用int型,但是int的取值范围太大,强制要求int的取值范围是7显然也不太可能,这时候就可以用枚举解决这个问题。
enum Weekday
{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};
//表示定义了一个数据类型 名字叫 enum Weekday,这仅仅定义了一个数据类型,并没有定义变量
int main(void)
{
enum Weekday day = Tuesday;
printf("%d\n",day);
return 0;
}
//输出1,物理上存储Monday默认从0开始的
/*
虽然输出是这样,但是初始化时不能写成enum Weekday day=3;
这样有的编译器虽然可以通过,但是逻辑上是不通的
即使写成enum Weekday day= 8 它也能通过。
*/
enum Weekday
{
Monday=4,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};
//这样就从4开始,后边依次是5、6、7……
优点:代码更安全,只能传有效的值
缺点:书写麻烦
用 typedef声明新类型名
# include <stdio.h>
# define INT int //这句在预编译阶段会进行一些简单的字符串替换,把代码中的 INT会替换成int 执行
typedef int Count;// Count 就代表了int 类型
typedef int Num[3];//Num 代表一个含有3个int类型元素的数组类型
typedef struct
{
int a;
double b;
}Stu; //Stu 代表一个结构体类型
int main(void)
{
Count a=3;
Num b={1,3,4}; //定义并初始化了一个含有3个整形元素数组类型变量 b
printf("%d %d %d\n",a,b[1],b[2]);
Stu c={10,8.8};//定义了一个结构体变量 叫c
printf("%d,%.2lf\n",c.a,c.b);
INT d= 12; //编译时系统会替换成 int d =12;来执行
printf("%d\n",d);
return 0;
}
本文章使用limfx的vsocde插件快速发布