作者:uy不uf | 来源:互联网 | 2023-09-23 12:17
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点。
一般定义形式
union 共用体名
{
成员表列
}变量表列;
1.同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。
2.共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。
3.共用体变量的地址和它的各成员的地址都是同一地址。
4.不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,并且,不能在定义共用体变量时对它进行初始化。
5.不能把共用体变量作为函数参数,也不能是函数带回共用体变量,但可以使用指向共用体变量的指针。
6.共用体类型可以出现在结构体类型的定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型的定义中,数组也可以作为共用体的成员。
书上例题:
//对候选人得票的统计程序,设有3个候选人,每次输入一个得票的候选人的名字,要求输出个人得票的结果
#include
#include
struct person
{
char name[20];
int count;
}leader[3]={{"Li",0},{"Wang",0},{"Ma",0}};
void main()
{
int i,j;
char leader_name[20];
for(i=0;i<10;i++)
{
scanf("%s",&leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
for(j=0;j<3;j++)
printf("%s:%d\n",leader[j].name,leader[j].count);
}
#include
struct
{
int num;
char name[20];
char sex;
char job;
union
{
int banji;
char position[10];
}category;
}person[2];
void main()
{
int i;
for(i=0;i<2;i++)
{
scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);
if(person[i].job=='s')
scanf("%d",&person[i].category.banji);
else if(person[i].job=='t')
scanf("%s",&person[i].category.position);
else printf("error!");
}
printf("\n");
printf("No Name sex job class/position\n");
for(i=0;i<2;i++)
if(person[i].job=='s')
printf("%d %s %c %c %d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.banji);
else
{
printf("%d %s %c %c %s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
}
}
枚举在C/C++中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。
例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 就是一个枚举。
枚举的说明与结构和联合相似, 其形式为:
enum 枚举名
{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
} 枚举变量;
书上例题
#include
void main()
{
enum color{red,yellow,blue,white,black};
enum color i,j,k,pri;
int n,loop;
n=0;
for(i=red;i<=black;i++)
for(j=red;j<=black;j++)
if(i!=j)
{
for(k=red;k<=black;k++)
if((k!-i) && (k!=j))
{
n=n+1;
printf("-4f",n);
for(loop=1;loop<=3;loop++)
{
switch (loop)
{
case 1:pri=i;break;
case 2:pri=j;break;
case 3:pri=k;break;
default:break;
}
switch (pri)
{
case red:printf("%-10s",red);
break;
case yellow:printf("%-10s",yellow);
break;
case blue:printf("%-10s",blue);
break;
case white:printf("%-10s",white);
break;
case black:printf("%-10s",black);
break;
default:
break;
}
}
printf("\n");
}
}
printf("\nTotal:%5d\n",n);
}