1.共用体类型
1.1 含义:用同一段内存存放不同类型的变量,也就是使用覆盖技术,后一个数据覆盖前面的数据,使几个不同的变量共享同一段内存的结构成为共用体。往往在数据处理中,有时需要对同一段内存空间安排不同的用途,这时用共用体类型比较方便。
1.2 形式
union Data
{
int i;
char ch;
float f;
}a,b,c;
1.3 引用共用体变量的方式
如a.f;
1.4 共用体类型的数据特点
(1).共用体与结构体非常相似,结构体变量所占内存长度等于各个成员占内存长度的和,每个成员分别占有自己的内存,而共用体变量所占内存长度等关于最长的成员的长度。
(2).同一段内存可以存放几种不同类型的成员,但每一瞬间只能存放其中一个成员。
(3).可以对共用体变量初始化,但初始化表中只能有一个常量,union Data a = {16}。
(4).共用体变量中起作用的是最后一次被赋值的成员变量。
(5)共用体变量的地址和它的各个成员的地址都是同一地址。
(6)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,如a = 1 不对。
(7)可以使用共用体变量的指针做函数参数。
(8)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组,繁反之也可以。
举一个简单的例子如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 struct 3 { 4 int num; 5 char name[10]; 6 char sex; 7 char job; 8 union 9 { 10 int clas;//成员班级 11 char posion[10];//成员职务 12 }category; //成员共用体变量 13 }person[2]; //定义结构体数组,有两个元素 14 int main() 15 { 16 int i; 17 for (int i = 0; i < 2; i++) 18 { 19 printf("输入两个成员的数据信息:"); 20 scanf_s("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job); 21 if (person[i].job == 's') 22 scanf_s("%d",&person[i].category.posion); 23 else if (person[i].job == 't') 24 scanf_s("%s", &person[i].category.posion); 25 else 26 printf("输入有误"); 27 } 28 printf(" "); 29 printf("详细信息如下:"); 30 for (int i = 0; i < 2; i++) 31 { 32 if (person[i].job == 's') 33 printf("%-6d,%-6s%,%-6c,%-6d ", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.clas); 34 else 35 printf("%-6d,%-6s%,%-6c,%-6d ", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.posion); 36 } 37 return 0; 38 }
2.定义和使用结构体变量
含义:由不同类型数据组成的组合型数据结构成为结构体。
2.1 建立结构体
1 struct MyStruct 2 { 3 long num; 4 float score; 5 char name[20]; 6 int age; 7 struct MyStruct *netx; 8 };
2.2 结构体变量的定义
(1).struct 结构体名
{
}变量名列表
如:
1 struct MyStruct 2 { 3 long num; 4 float score; 5 struct MyStruct *netx; 6 }student1,student2;