一、共用体的应用场景
通信时:如果不确定发送的包的格式,可以定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。
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用来定义类型的别名,起到类型易于记忆的功能。另一个功能时定义机器无关的类型。