C语言共用体和枚举
  C

C语言共用体和枚举

 次点击
19 分钟阅读

共用体概述

共用体的使用场景

通信时:如果不确定发送的包的格式,可以定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。

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
*/

© 本文著作权归作者所有,未经许可不得转载使用。