Linux C语言:C语言共用体和枚举

一、共用体的应用场景

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

union Data{
 
    int i;
 
    float f;
 
    char str[9];
 
    double d;
 
}data;

    数据比较大时:不会同时使用,比如一个表示老师,一个表示学生,如果要统计教师和学生的情况用结构体的话就有点浪费了!用共用体的话,只占用最长的那个数据结构所占用的空间,就足够了!--节省空间

二、共用体的概述

        在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。

共用体在定义、说明和使用形式上与结构体相似。两者在本质上的不同仅在于使用你内存的方式上

                共用体的定义

                语法:

                union  共用体名

                {

                  共用体成员列表

                };

共用体的使用

        union  共用体名  变量名

        union  共用体名  变量名 = {成员值}

        定义共用体时顺便创建变量

#include <stdio.h>
struct person
{
	char name[16];
	int age;
	char sex;
	char phone[12];
};
 
union un
{
	int num;
	char ch;
	struct person student;
	struct person teacher;
	//定义共用体时定义变量并赋值
}u2 = {69};
 
int main(int argc, const char *argv[])
{
	//1、定义完共用体变量再赋值
	union un u;
	u.num = 67;
	printf("num = %d ,ch = %c\n",u.num, u.ch);
 
	//2、定义共用体变量时赋值
	union un u1 = {
		.student.name = "zhangsan",
		.student.age = 18,
	};
	printf("num = %d ,ch = %c\n",u1.num, u1.ch);
	printf("name = %s, age = %d\n", u1.student.name, u1.student.age);
 
 
	printf("num = %d ,ch = %c\n",u2.num, u2.ch);
 
	return 0;
}

共用体的大小

三、枚举的概述:C语言中构造类型之一

        在开发中,有些变量只有几种可能的取值,比如:一周有七天、一年有四季、在枚举的定义中,会将变量一一列出来。

枚举的定义

                语法:

                enum  枚举名

                {

                  枚举成员列表

                };

枚举的使用

        enum  枚举名  变量名 

        enum  枚举名  变量名 = 枚举常量

        定义枚举时顺便创建变量

枚举的特点

        默认第一个成员从0开始,后面成员依次+1

        有特定值的成员后面,从特定值开始依次+1

        同一个枚举类型中,成员值可以相同

        不同的枚举类型中,成员名不可以一样

#include <stdio.h>
 
enum e
{
	one = 1,
	two,
	three = 1,
	four,
	five
};
 
enum en
{
	one1,
	two1,
	three1,
};
 
int main(int argc, const char *argv[])
{
	enum e t;
	t = two;
	printf("%d\n",t);
	return 0;
}

四、typedef关键字

typedef关键字的作用

        typedef是在计算机编程语言中用来为复杂的声明定义简单的别名

        可以是内部数据类型也可以是自定义数据类型

typedef关键字的意义

        给变量一个易记且意义明确的新名字

        简化一些比较复杂的类型声明。

typedef关键字的使用

基本语法:

  typedef   <已有数据类型>   <新数据类型>;

如:

typedef   int  INTEGER;

这里新定义了数据类型INTEGER, 其等价于int

  INTEGER  i;    <==>  int   i;

简单的新名字:

        typedef unsigned char u_int8;         //8位无符号数

        typedef unsigned short int u_int16; //16位无符号数

        typedef unsigned int u_int32;          //32位无符号数

化繁为简:

        typedef   struct  _node_

        {

                int  data;

                struct _node_  *next;

        } listnode, *linklist;
#include <stdio.h>
struct person
{
	char name[16];
	int age;
	char sex;
	char phone[12];
};
 
typedef struct person p;
typedef union un
{
	int num;
	char ch;
	p student;
	p teacher;
	//定义共用体时定义变量并赋值
	//}u2 = {69};
}a,* a_p;
int main(int argc, const char *argv[])
{
	//1、定义完共用体变量再赋值
	a u;
	a_p p;  //等价于union un *p;
	p = &u;
	u.num = 67;
	printf("num = %d ,ch = %c\n",p->num, p->ch);
 
	//2、定义共用体变量时赋值
	union un u1 = {
		.student.name = "zhangsan",
		.student.age = 18,
	};
	printf("num = %d ,ch = %c\n",u1.num, u1.ch);
	printf("name = %s, age = %d\n", u1.student.name, u1.student.age);
 
 
	//printf("num = %d ,ch = %c\n",u2.num, u2.ch);
 
	return 0;
}

typedef关键的作用是什么,和define有什么区别?

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,可以是内部数据类型也可以是自定义数据类型
区别:

        使用不同:define定义后面不用加分号,并且它的别名在对象的前面。typedef需要加分号,并且它的别名后面在替换对象的前面
        原理不同:define是C语言中定义的语法,是预处理指令,在预处理进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef是关键字,在编译时处理,有类型检查功能。他在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便 ,不仅使程序书写简单,也使意义明确,增强可读性。
        功能不同:typedef用来定义类型的别名,起到类型易于记忆的功能。另一个功能时定义机器无关的类型。

 

 

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值