在進行某些算法的C語言編程的時候,需要使幾種不同類型的變量存放到同一段內存單元中。也就是使用覆蓋技術,幾個變量互相覆蓋。這種幾個不同的變量共同佔用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體。注:在某些書籍中可能稱之爲“聯合體”,但是“共用體”更能反映該類型在內存的特點。
一般定義形式
union 共用體名{
成員表列
}變量表列;
1.同一個內存段可以用來存放幾種不同類型的成員,但是在每一瞬間只能存放其中的一種,而不是同時存放幾種。換句話說,每一瞬間只有一個成員起作用,其他的成員不起作用,即不是同時都在存在和起作用。
2.共用體變量中起作用的成員是最後一次存放的成員,在存入一個新成員後,原有成員就失去作用。
3.共用體變量的地址和它的各成員的地址都是同一地址。
4.不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,並且,不能在定義共用體變量時對它進行初始化。
5.不能把共用體變量作爲函數參數,也不能是函數帶回共用體變量,但可以使用指向共用體變量的指針。
6.共用體類型可以出現在結構體類型的定義中,也可以定義共用體數組。反之,結構體也可以出現在共用體類型的定義中,數組也可以作爲共用體的成員。
書上例題:
//對候選人得票的統計程序,設有3個候選人,每次輸入一個得票的候選人的名字,要求輸出個人得票的結果
#include<stdio.h>
#include<string.h>
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<stdio.h>
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<stdio.h>
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);
}