一、连系的界说
界说一个连系范例的一般形式为:
union 连系名
{
成员表
};
成员表中含有若干成员,成员的一般形式为: 范例说明符 成员名 成员名的定名应切合标识符的划定。
譬喻:
union perdata
{
int class;
char office[10];
};
界说了一个名为perdata的连系范例,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。连系界说之后,即可举办连系变量说明,被说明为perdata范例的变量,可以存放整型量class或存放字符数组office。
二、连系变量的说明
连系变量的说明和布局变量的说明方法沟通, 也有三种形式。即先界说,再说明;界说同时说明和直接说明。以perdata范例为例,说明如下:
union perdata
{
int class;
char officae[10];
};
union perdata a,b; /*说明a,b为perdata范例*/
可能可同时说明为:
union perdata
{ int class;
char office[10]; }a,b;或直接说明为: union
{ int class;
char office[10]; }a,b
经说明后的a,b变量均为perdata范例。 它们的内存分派示意图如图7—8所示。a,b变量的长度应便是 perdata 的成员中最长的长度, 即便是
office数组的长度,共10个字节。从图中可见,a,b变量如赋予整型值时,只利用了2个字节,而赋予字符数组时,可用10个字节。
连系变量的赋值和利用
春连系变量的赋值,利用都只能是对变量的成员举办。 连系变量的成员暗示为: 连系变量名.成员名 譬喻,a被说明为perdata范例的变量之后,可利用 a.class a.office 不答允只用连系变量名作赋值或其它操纵。 也不答允春连系变量作初始化赋值,赋值只能在措施中举办。还要再强调说明的是,一个连系变量, 每次只能赋予一个成员值。换句话说,一个连系变量的值就是连系变员的某一个成员值。
[例7.15]设有一个西席与学生通用的表格,西席数据有姓名,年数,职业,教研室四项。学生有姓名,年数,职业,班级四项。
编程输入人员数据, 再以表格输出。
main()
{
struct
{
char name[10];
int age;
char job;
union
{
int class;
char office[10];
} depa;
}body[2];
int n,i;
for(i=0;i<2;i++)
{
printf("input name,age,job and department\n");
scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
if(body[i].job==’s’)
scanf("%d",&body[i].depa.class);
else
scanf("%s",body[i].depa.office);
}
printf("name\tage job class/office\n");
for(i=0;i<2;i++)
{
if(body[i].job==’s’)
printf("%s\t%3d %3c %d\n",body[i].name,body[i].age
,body[i].job,body[i].depa.class);
else
printf("%s\t%3d %3c %s\n",body[i].name,body[i].age,
body[i].job,body[i].depa.office);
}
}
本例措施用一个布局数组body来存放人员数据, 该布局共有四个成员。个中成员项depa是一个连系范例, 这个连系又由两个成员构成,一个为整型量class,一个为字符数组office。在措施的第一个for语句中,输入人员的各项数据,先输入布局的前三个成员name,age和job,然后鉴别job成员项,如为"s"则春连系depa·class输入(对学生赋班级编号)不然对depa·office输入(对西席赋教研组名)。
在用scanf语句输入时要留意,凡为数组范例的成员,无论是布局成员照旧连系成员,在该项前不能再加"&"运算符。如措施第18行中
body[i].name是一个数组范例,第22行中的body[i].depa.office也是数组范例,因此在这两项之间不能加"&"运算符。措施中的第二个for语句用于输出各成员项的值:
本章小结
1. 布局和连系是两种结构范例数据,是用户界说新数据范例的重要手段。布局和连系有许多的相似之处,它们都由成员构成。成员可以具有差异的数据范例。成员的暗示要领沟通。都可用三种方法作变量说明。
2. 在布局中,各成员都占有本身的内存空间,它们是同时存在的。一个布局变量的总长度便是所有成员长度之和。在连系中,所有成员不能同时占用它的内存空间,它们不能同时存在。连系变量的长度便是最长的成员的长度。
3. “.”是成员运算符,可用它暗示成员项,成员还可用“->”运算符来暗示。
4. 布局变量可以作为函数参数,函数也可返回指向布局的指针变量。而连系变量不能作为函数参数,函数也不能返回指向连系的指针变量。但可以利用指向连系变量的指针,也可利用连系数组。
5. 布局界说答允嵌套,布局中也可用联相助为成员,形成布局和连系的嵌套。
6. 链表是一种重要的数据布局,它便于实现动态的存储分派。本章先容是单向链表,还可构成双向链表,轮回链表等。