Bootstrap

通俗讲解C语言的 struct enum union

通俗讲解C语言的 struct enum union

1)struct

最为常见的结构体,其更倾向于将我们所需要的多种数据类型整合成为一个整体,方便使用者的调用和理解。

可以极大的提高代码的可读性。

学习struct结构体需要从两个方面去理解。

1.struct的定义格式

我认为有3种格式,各有优缺点

//第一种格式定义方便,但是在调用时非常不方便,
struct student_type_1
{
    int number;
    char sex;
}; // <-别忘了分号!
//如果要调用这个结构体,应该像这样,每次前面要加struct,太麻烦了。
int main(void)
{
    struct student_type_1 test1 = { 111,'M'};
}
//第二种,我个人是最喜欢用的,非常清晰,而且用了typedef关键字
//这样在主函数中调用时不过可以不写struct,还可以给这个结构赋予其他的名字
typedef struct student_type_2
{
    int number;
    char sex;
}type2;
int main(void)
{
    student_type_2 test2_1 = { 112,'M' };
    type2 test2_2 = { 113,'M' };
}
//第三种是隐式调用,和第二种很像,不过忽略了直接的结构体命名,
//更注重强调的是这种变量的别名和成员组成
//对比之下,第二种更强调结构体的种类
typedef struct
{
    int number;
    char sex;
}student_type_3, type3;

int main(void)
{
    student_type_3 test3_1 = { 114,'M' };
    type3 test3_2 = { 115,'M' };
}
struct的访问

结构体的访问,有两种模式

1)用"."符号直接访问

用上面的案例

typedef struct student_type_2
{
    int number;
    char sex;
}type2;
int main(void)
{
    student_type_2 test2_1 = { 112,'M' };
    type2 test2_2 = { 113,'M' };

    printf("%d", test2_1.number);

}

2)利用指针访问

typedef struct student_type_2
{
    int number;
    char sex;
}type2;
int main(void)
{
    student_type_2 test2_1 = { 112,'M' };
    student_type_2* test2_1_pointer = &test2_1;

    printf("%d", test2_1_pointer->number);

}

2)枚举 enum (enumeration)

枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。这是网上的解释.

我感觉这个解释不太方便理解。

首先,它是结构体,这说明它是可以定义的。

我的解释就是。枚举就是在定义一堆常量,而且常量的值是自动分配好的,我只用管常量叫什么就好取值的时候通过常量名直接取值。

多说无益,直接上案例:

typedef enum
{
    LIN_DAN, //无论写的什么常量名,这里的常量值按顺序从0依次递增。LIN_DAN为int型的0
    VIKTOR_AXELSEN,//为 int型的1
    SHI_YU_QI,//为 int型的2
    JONATAN,//为 int型的3
    ANTONSEN//为 int型的4
}Badminton_Rank;
int main(void)
{
    Badminton_Rank now = VIKTOR_AXELSEN;
    printf("%d\n", now);//说明VIKTOR_AXELSEN的值是1,就是now的值
    //既然常量可以用int替代了,那吗switch-case语法就可以大显身手了
    switch (now)
    {
    case 1: puts("安赛龙世界排名是1"); break;
    case 2: puts("石宇奇世界排名是2"); break;
    case 3: puts("乔纳坦世界排名是3"); break;
    case 4: puts("安东森世界排名是4"); break;
    default:break;
    }
}

其实枚举能做到的,直接定义常量也可以做到,但枚举更美观而且方便老师出题,最重要的是可以提高代码的可读性,面对庞大复杂的文件,枚举的使用可以降低理解代码的难度。

联合union

联合型结构体比较少见。

它更注重成员变量类型

union中可以定义多个成员,union的大小由最大的成员的大小决定。  可用sizeof验证。
union成员共享同一块大小的内存,一次只能使用其中的一个成员。  可直接用取地址符&验证。
对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节 这个解释引用自 博客园的大佬 十日十乞)

如果说struct型结构体是公务员考生名单上所有人上岸了,都有用到了。

那union型结构体是只指定公务员考生名单中的一位暂时录取使用。如果后面有需要的话就把刚刚那个人换掉,换上名单上能力更适合的另一位考生干活,这样可以充分节约岗位资源(内存)

还是上案例,搭配上面的解释,想必会更容易理解

typedef union
{
    int int_value;//考生1
    char char_value;//考生2
}Data;

int main(void)
{
    //共用体变量不可以在定义的同时初始化。
    Data m;

    int temp1 = 65;//考试的科目为:INT
    m.int_value = temp1;
    printf("%d\n", m.int_value);
    printf("%c\n", m.char_value);

    char temp3 = 'a';//考试的科目为:CHAR
    m.char_value = temp3;
    printf("%d\n", m.int_value);
    printf("%c\n", m.char_value);

}

非常感谢您可以耐心读到这里,博客内容写的很粗糙,只是分享自己在学习中的一些想法,有错误指正和改进欢迎提出!

;