9.4 共用体&枚举&typedef

一、共用体

概念

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

图片来源:B站 up 织码匠

使用

  1. 定义和初始化

# 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;
}


可以看到无论是定义还是引用都和结构体非常类似,那么它们之间有什么区别呢?

  1. 与结构体的区别 ① 在某一个时刻只能使用一个成员来存储有效数据 ② 等第二次赋值时,即使是不同数据类型,也会覆盖掉前一次的值,因为他们首地址时一样的。

  2. 共用体变量开头的地址必须 被其最宽的基本类型成员的大小所整除,共用体总长度必须大于等于其最宽成员的长度。

二、枚举

什么是枚举

把一个事物所有可能的取值一一列举出来,变量的值仅限于列举出来的值的范围内。

使用

假如存放一个星期所有的天数,原来可以用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……

优缺点

  1. 优点:代码更安全,只能传有效的值

  2. 缺点:书写麻烦

三、Typedef

用 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插件快速发布