C语言学习—联合体Union和关键字Typedef
前言
内容主要为联合体Union和关键字Typedef 的认知学习与简单应用
1 联合体Union
1.1 Union认知
Union常用于同一位置想要描述不同情况下的不同事件,特点是:
- 联合体的空间大小取决内部最大的元素
- 联合体内部元素地址相同,因此特点是数据易覆盖
#include <stdio.h>
//联合体学习
//结构体
struct Test1
{
int idata;
char cdata;
double ddata;
};
//联合体
union Test2
{
int idata;
char cdata;
double ddata;
};
int main()
{
struct Test1 T1;
union Test2 T2;
printf("struct的大小为:%d\n",sizeof(T1));
printf("union的大小为:%d",sizeof(T2));//联合体的空间大小取决内部最大的元素
printf("idata:%p\n",&T1.idata);
printf("cdata:%p\n",&T1.cdata);
printf("ddata:%p\n",&T1.ddata);
//联合体内部元素地址相同,因此特点是数据易覆盖
printf("idata:%p\n",&T2.idata);
printf("cdata:%p\n",&T2.idata);
printf("ddata:%p\n",&T2.idata);
return 0;
}
1.2 Union应用
由上述特点,Union常与结构体一同使用。在结构体中使用联合体,常用于描述一个事件中的两种或多种子事件。
#include <stdio.h>
//联合体学习
//联合体应用(结构体中使用联合体,常用于描述一个事件中的两种或多种子事件)
struct Test3
{
char name[32];
char statu;
union D
{
int class;
char ZiWu[32];
}mes;
};
int main()
{
struct Test3 Data[2];
for(int i=0;i<2;i++)
{
printf("请输入身份:s代表学生,t代表老师\n");
scanf("%c",&Data[i].statu);
if(Data[i].statu=='s')
{
printf("请输入该学生的班级:\n");
scanf("%d",&Data[i].mes.class);
printf("请输入该学生的名字:\n");
scanf("%s",&Data[i].name);
}
else
{
printf("请输入该老师的职务:\n");
scanf("%s",&Data[i].mes.ZiWu);
printf("请输入该老师的名字:\n");
scanf("%s",&Data[i].name);
}
getchar();//吸收回车
}
for(int i=0;i<2;i++)
{
if(Data[i].statu=='s')
{
printf("%号人员身份为学生\n",i+1);
printf("该学生的班级:%d\n",Data[i].mes.class);
printf("该学生的名字:%s\n",Data[i].name);
}
else
{
printf("%号人员身份为老师\n",i+1);
printf("该老师的职务:%s\n",Data[i].mes.ZiWu);
printf("该老师的名字:%s\n",Data[i].name);
}
}
return 0;
}
2 关键字typedef
关键字typedef常用来指定某个数据类型为新的名字
#include <stdio.h>
//Typedef关键字学习
//结构体定义
struct Test
{
int data;
int data1;
};
//关键字定义
typedef struct Test Demo;
int main()
{
Demo D;//关键字使用
D.data=1;
D.data1=2;
printf("data=%d,data1=%d\n",D.data,D.data1);
}