【C语言基础】枚举和联合体

:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
:文章若有幸对你有帮助,可点赞 收藏 ⭐不迷路
:内容若有错误,敬请留言 指正!原创文,转载请注明出处

文章目录

  • 前言
  • 一、枚举
    • 1.1 枚举的含义
    • 1.2 枚举的语法
    • 1.3 访问枚举成员
    • 1.4 宏定义和枚举的区别
  • 二、共用体
    • 2.1 访问共用体中的元素
    • 2.2 联合体指针


前言

多个常量具有强相关性的时候,例如性别有男女之分;一周七天;一年12个月等,最好使用枚举来替代宏定义,即用一个变量名来包含所有的这些强相关性的常量,当要用的时候,取出其一即可。

#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

一、枚举

1.1 枚举的含义

枚举的含义:当一个变量有多种可能的数值时,适合使用枚举(Enumeration)来表示这个变量。其中的数值被称呼为枚举常量或是枚举成员。

1.2 枚举的语法

枚举语法:在C语言中,默认第一个枚举成员的值为int型零,后续枚举成员的值在前一个成员上加1,因此枚举成员都无需定义类型。

enum enum_name {
    member1,
    member2,
};

其中,enum_name 是枚举类型的名称,member1member2等是枚举成员的名称。
【C语言基础】枚举和联合体_第1张图片
【C语言基础】枚举和联合体_第2张图片
下面是一个示例:

enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

但也可以显式地为枚举成员指定具体的整数值,例如:

enum Color {
    RED = 10,
    GREEN = 20,
    BLUE = 30
};

1.3 访问枚举成员

可以使用枚举类型名称和成员名称来访问枚举中的元素。假设有一个名为Weekday的枚举类型,包含了一周中的每个工作日,可以通过以下方式访问枚举中的元素:

enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY
};

enum Weekday today = MONDAY; // 声明并初始化变量

if (today == TUESDAY) {
    printf("今天是周二\n");
} else if (today == FRIDAY) {
    printf("今天是周五\n");
}

在这个示例中,我们声明了一个名为 today 的变量,并将其初始化为 MONDAY 枚举成员。然后,我们使用 if 语句判断 today 变量的值是否等于 TUESDAYFRIDAY 枚举成员,并打印对应的语句。

1.4 宏定义和枚举的区别

(1)枚举是将多个有关联的符号封装在一个枚举中,而宏定义是完全散的。也就是说枚举其实是多选一。
(2)什么情况下用枚举?当我们要定义的常量是一个有限集合时(譬如一星期有7天,譬如一个月有31天,譬如一年有12个月····),最适合用枚举。(其实宏定义也行,但是枚举更好)
(3)不能用枚举的情况下(定义的常量符号之间无关联,或者无限的)用宏定义。
总结:宏定义先出现,用来解决符号常量的问题;后来人们发现有时候定义的符号常量彼此之间有关联(多选一的关系),用宏定义来做虽然可以但是不贴切,于是乎发明了枚举来解决这种情况。

二、共用体

2.1 访问共用体中的元素

共用体又称为联合体
要访问共用体(union)中的元素,可以使用点运算符 (.) 或箭头运算符 (->),具体取决于共用体的使用方式。
如果共用体是一个变量,则可以使用点运算符来访问其成员。假设有以下共用体定义:

  union MyUnion {
        int i;
        float f;
    };
可以通过创建共用体变量并使用点运算符来访问其成员:
 union MyUnion u;
    u.i = 10;
    printf("%d\n", u.i);   // 输出: 10
    u.f = 3.14;
    printf("%f\n", u.f);   // 输出: 3.140000

如果共用体是一个指针,则需要使用箭头运算符来访问其成员。假设有以下共用体定义:

union MyUnion {
    int i;
    float f;
};
struct MyStruct {
    union MyUnion* u;
};

可以通过创建共用体指针,并使用箭头运算符来访问其成员:

union MyUnion u;
u.i = 10;
struct MyStruct s;
s.u = &u;
printf("%d\n", s.u->i);   // 输出: 10
u.f = 3.14;
printf("%f\n", s.u->f);   // 输出: 3.140000

需要注意的是,由于共用体中的成员共享存储空间,因此在访问共用体的不同成员之前应确保已正确设置了所需的成员类型。否则,可能导致数据类型的解释错误或访问越界的问题。

2.2 联合体指针

联合体指针是指指向联合体类型的指针。联合体(Union)是一种特殊的数据类型,它可以在同一内存空间中存储不同类型的成员变量,但同时只能存储其中的一种类型。
定义一个联合体类型如下:

union MyUnion {
    int num;
    char ch;
    float f;
};

通过使用联合体指针,我们可以操作联合体的成员变量。例如,假设有一个联合体变量 myUnion

union MyUnion myUnion;

我们可以定义一个联合体指针并将其指向这个联合体变量:

 union MyUnion *ptr = &myUnion;

通过指针访问联合体的成员变量,可以使用箭头运算符(->)或间接访问运算符(*)加括号。例如,访问联合体中的整型成员变量:

(*ptr).num = 42;
// 或者使用箭头运算符
ptr->num = 42;

类似地,我们可以通过联合体指针操作其他类型的成员变量。
需要注意的是,使用联合体指针时需要确保指针指向的是有效的联合体对象,否则可能导致未定义的行为和错误结果。

【C语言基础】枚举和联合体_第3张图片

你可能感兴趣的:(#,C语言,c语言,开发语言)