首页 > 技术知识 > 正文

1. 共用体

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

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

定义共用体的关键字: 复制union

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

结构体定义示例:

复制struct app { int a; char b; };

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

共用体定义示例:

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

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

共同体案例代码:

复制#include #include 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 #include #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 #include //枚举类型 /* 枚举内部的是常量标识符,这些常量标识符就相当于全局变量(声明放在函数之外) 枚举常量只能整型。 默认情况下枚举值是从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 } 审核编辑 黄昊宇

猜你喜欢