C语言-枚举、共用体

简介: C语言-枚举、共用体

1. 共用体

前面章节学习了结构体,结构体里可以按顺序存放相同或者不同的数据类型,每个成员都有它对应的存储空间。

而共用体和结构体一样也可以按顺序存放相同或者不同数据类型,但是与结构体的区别是,共用体所有成员共用一个存储空间,存储空间由成员中存储空间最大的来决定。


定义共用体的关键字: union


下面通过结构体、共同体两个定义代码对比区别。


结构体定义示例:

struct app
{
    int a;
    char b;
};

结构体:每个成员是占用独立的空间,结构体成员之间会因为内存对齐产生间隙。

共用体定义示例:

union app
{
    int a;
    int b;
    char c;
};

**共用体:**也称为联合体,采用内存覆盖技术,每个成员共用一个内存空间,开空间是以最大的成员开空间。 在单片机、嵌入式设备里使用较多。共用体的语法和使用方法(定义、成员变量的访问形式等等)与结构体一样。

共同体案例代码:

#include <stdio.h>
#include <stdlib.h>
union app
{
    int a;
    int b;
    char c;
};
//匿名方式定义,只能在定义共用体的时候就定义变量
union
{
    int a;
    int b;
    char c;
}a1,a2,a3;  //定义3个变量
union app2
{
    int a;
    int b;
    char c;
}b1,b2;
typedef union app3
{
    int a;
    int b;
    char c;
}c1;  //c1是新的数据类型--union app3的别名
int main()
{
    b1.a=65;
    b1.b=66;
    printf("%d\n",b1.a); //66
    printf("%d\n",b1.b); //66
    printf("%c\n",b1.c); //66 
    return 0;
}

2. 枚举

C语言的枚举可以给一串有序的数字集合定义名字,特别是数量较多的整数需要定义名字时,比#define更加方便。特别是定义函数的返回值类型,特别方便,项目开发中,一般标准的函数返回值都有很多种情况,为了方便调用者判断错误类型,可以把这些错误值全部使用枚举定义,这样调用者就能清楚知道每个数值代表的含义。


枚举的定义语法:

enum 枚举名 {枚举元素1,枚举元素2,……};

默认成员都是从0开始,如果某一个成员被赋了值,则该成员以后的元素都以此为基础递增。

枚举的定义及用法示例:

#include <stdio.h>
#include <stdlib.h>
#define DEF_VAL 100
//枚举类型
/*
枚举内部的是常量标识符,这些常量标识符就相当于全局变量(声明放在函数之外)
枚举常量只能整型。
默认情况下枚举值是从0开始的,依次递增。
*/
enum app
{
   a1='A',a2,a3,a4
};
typedef enum app2
{
   b1='A',b2,b3,b4
}type_app2;
//枚举在程序开发中最常用的地方是:表示函数执行的状态值。
int main()
{
    printf("%d\n",a1);
    printf("%d\n",a2);
    printf("%d\n",a3);
    printf("%d\n",a4);
    return 0;
}
type_app2 func1()
{
    return b2;
}
enum app2 func2()
{
    return b3;
}

枚举应用案例2:

#include <stdio.h>
#include <stdlib.h>
//枚举类型
/*
枚举内部的是常量标识符,这些常量标识符就相当于全局变量(声明放在函数之外)
枚举常量只能整型。
默认情况下枚举值是从0开始的,依次递增。
*/
enum app
{
   a1=0,   //表示OK
   a2,   //第一次空间申请失败
   a3,   //表示第二次空间申请失败
   a4,
   a5,
   a6
};
//枚举在程序开发中最常用的地方是:表示函数执行的状态值。
enum app func();
int main()
{
    printf("%d\n",func());
    return 0;
}
enum app func()
{
    int *p1=NULL;
    int *p2=NULL;
    p1=malloc(4);
    if(p1==NULL)
    {
        return a2; //1
    }
    p2=malloc(4);
    if(p2==NULL)
    {
        return a3;//2
    }
    return a1; //0
}
目录
相关文章
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
305 19
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
409 4
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
226 0
深入C语言,发现多样的数据之枚举和联合体
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
224 1
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
260 0
|
编译器 C语言 C++
【C语言基础】:自定义类型(二) -->联合和枚举
【C语言基础】:自定义类型(二) -->联合和枚举
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
452 3