共用体概述
共用体的使用场景
通信时:如果不确定发送的包的格式,可以定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。
union Data{
int i;
float f;
char str[9];
double d;
}data;数据比较大时:不会同时使用,比如一个表示老师,一个表示学生,如果要统计教师和学生的情况用结构体的话就有点浪费了!用共用体的话,只占用最长的那个数据结构所占用的空间,就足够了!--节省空间
共用体概述
在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。
共用体在定义、说明和使用形式上与结构体相似。两者在本质上的不同仅在于使用你内存的方式上
共用体的定义
语法:
union 共用体名{
共用体成员列表
};共用体的使用
union 共用体名 变量名
union 共用体名 变量名 = {成员值}
定义共用体时顺便创建变量
#include <stdio.h>
#include <string.h>
struct person
{
char name[16];
int age;
};
union un
{
int num; //为了演示我们共用地址的现象
struct person teacher;
struct person student;
};
int main(int argc, const char *argv[])
{
//第一种,定义完变量再赋值
union un un;
un.num = 1003;
printf("%d, %s %d\n",un.num, un.teacher.name, un.teacher.age);
strcpy(un.teacher.name,"zhangsan");
un.teacher.age = 40;
printf("%d, %s %d\n",un.num, un.teacher.name, un.teacher.age);
printf("%p %p %p\n",&un.num, &un.teacher, &un.student);
return 0;
}
/*
1003, � 4096
1851877498, zhangsan 40
0x7fff79a0c770 0x7fff79a0c770 0x7fff79a0c770
*/#include <stdio.h>
#include <string.h>
struct person
{
char name[16];
int age;
};
union un
{
//int num; //为了演示我们共用地址的现象
struct person teacher;
struct person student;
//第三种:定义共用体时定义变量
}u3, u4 = {"张三",56};
int main(int argc, const char *argv[])
{
/*第一种,定义完变量再赋值
union un un;
un.num = 1003;
printf("%d, %s %d\n",un.num, un.teacher.name, un.teacher.age);
strcpy(un.teacher.name,"zhangsan");
un.teacher.age = 40;
printf("%d, %s %d\n",un.num, un.teacher.name, un.teacher.age);
printf("%p %p %p\n",&un.num, &un.teacher, &un.student);
*/
//第二种,定义变量时赋值
union un u1 = {"zhangsan",20};
printf("%s %d\n",u1.teacher.name, u1.teacher.age);
printf("%s %d\n",u1.student.name, u1.student.age);
union un u2 = {
.teacher.name = "lisi",
.teacher.age = 30,
};
printf("%s %d\n",u2.teacher.name, u2.teacher.age);
printf("%s %d\n",u2.student.name, u2.student.age);
strcpy(u3.teacher.name,"王五");
u3.teacher.age = 40;
printf("%s %d\n",u3.teacher.name, u3.teacher.age);
printf("%s %d\n",u3.student.name, u3.student.age);
printf("%s %d\n",u4.teacher.name, u4.teacher.age);
printf("%s %d\n",u4.student.name, u4.student.age);
return 0;
}
共用体数组和指针
#include <stdio.h>
#include <string.h>
struct person
{
char name[16];
int age;
};
union un
{
struct person teacher;
struct person student;
//第三种:定义共用体时定义数组或指针
}u3[2], u4[2] = {{"张杰",39},{"薛之谦",40}},*p2 = u4;
int main()
{
//第一种:定义完共用体定义数组和指针
union un u1[3],*p;
p = u1;
//u1[0].teacher.name[0] = 'a';
strcpy(u1[0].teacher.name, "张三");
u1[0].teacher.age = 30;
strcpy(u1[1].teacher.name, "李四");
u1[1].teacher.age = 40;
strcpy(p[0].teacher.name, "张三");
p[0].teacher.age = 30;
strcpy((p+1)->teacher.name, "李四");
(p+1)->teacher.age = 40;
/*
printf("%s %d\n",u1[0].teacher.name, u1[0].teacher.age);
printf("%s %d\n",u1[0].student.name, u1[0].student.age);
printf("%s %d\n",u1[1].teacher.name, u1[1].teacher.age);
printf("%s %d\n",u1[1].student.name, u1[1].student.age);
*/
printf("%s %d\n",(p+0)->teacher.name, p->teacher.age);
printf("%s %d\n",p->student.name, p->student.age);
printf("%s %d\n",p[1].teacher.name, p[1].teacher.age);
printf("%s %d\n",p[1].student.name, p[1].student.age);
//第二种:定义共用体数组时或指针
union un u2[2] = {{"刘亦菲",40},{"杨幂",35}},*p1 = u2;
printf("%s %d\n",u2[0].teacher.name, u2[0].teacher.age);
printf("%s %d\n",u2[0].student.name, u2[0].student.age);
printf("%s %d\n",p1[1].teacher.name, p1[1].teacher.age);
printf("%s %d\n",(p1+1)->student.name, (p1+1)->student.age);
printf("%s %d\n",p2->teacher.name, p2->teacher.age);
printf("%s %d\n",p2[0].student.name, p2[0].student.age);
printf("%s %d\n",u4[1].teacher.name, u4[1].teacher.age);
printf("%s %d\n",u4[1].student.name, u4[1].student.age);
return 0;
}
共用体的大小
#include <stdio.h>
//共用体取最大成员的大小,需要考虑字节对齐,一定是对齐数的整数倍
union un //8
{
int i;
char b;
double d;
};
union u1 //8
{
int i;
char s[7];
};
union u2 //7
{
char c;
char s[7];
};
union u3 //16
{
double d;
char s[13];
};
int main(int argc, const char *argv[])
{
printf("%ld\n",sizeof(union un));
printf("%ld\n",sizeof(union u1));
printf("%ld\n",sizeof(union u2));
printf("%ld\n",sizeof(union u3));
return 0;
}
枚举概述
枚举是C语言中构造类型之一
在开发中,有些变量只有几种可能的取值,比如:一周有七天、一年有四季、在枚举的定义中,会将变量一一列出来。
枚举的语法
enum 枚举名
{
枚举成员名
};枚举的使用
enum 枚举名 变量名
enum 枚举名 变量名 = 枚举常量
定义枚举时顺便创建变量
枚举的特点
默认第一个成员从0开始,后面成员依次+1
有特定值的成员后面,从特定值开始依次+1
同一个枚举类型中,成员值可以相同
不同的枚举类型中,成员名不可以一样
#include <stdio.h>
/*
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
*/
enum e
{
MON = 1, //默认是0从开始,如果给定特定值,从特定值开始,后续依次+1
TUE,
WED = 1,
THU, //依次进行+1,是依据上一个成员的值+1,所以现在是2
FRI,
SAT,
SUN,
} e3 = THU;
/*不同枚举类型中,不能出现成员名一样
enum en
{
MON,
TUE,
};
*/
int main(int argc, const char *argv[])
{
enum e e1;
e1 = MON;
printf("%d\n",e1);
enum e e2 = WED;
printf("%d\n",e2);
printf("%d\n",e3);
return 0;
}
/*
1
1
2
*/