C语言学习教程第七章-结构与联合(8)

一、联合的定义

定义一个联合类型的一般形式为:
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. 链表是一种重要的数据结构,它便于实现动态的存储分配。本章介绍是单向链表,还可组成双向链表,循环链表等。

时间: 2024-09-14 16:52:19

C语言学习教程第七章-结构与联合(8)的相关文章

C语言学习教程第七章-结构与联合(5)

topoic=动态存储分配 在数组一章中,曾介绍过数组的长度是预先定义好的, 在整个程序中固定不变.C语言中不允许动态数组类型.例如: int n;scanf("%d",&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明, 这是错误的.但是在实际的编程中,往往会发生这种情况, 即所需的内存空间取决于实际输入的数据,而无法预先确定.对于这种问题, 用数组的办法很难解决.为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,

C语言学习教程第七章-结构与联合(7)

[例7.14]将以上建立链表,删除结点,插入结点的函数组织在一起,再建一个输出全部结点的函数,然后用main函数调用它们.#define NULL 0#define TYPE struct stu#define LEN sizeof(struct stu)struct stu{int num;int age;struct stu *next;};TYPE * creat(int n){struct stu *head,*pf,*pb;int i;for(i=0;i<n;i++){pb=(TYPE

C语言学习教程第七章-结构与联合(1)

结构类型定义和结构变量说明 在实际问题中,一组数据往往具有不同的数据类型.例如, 在学生登记表中,姓名应为字符型:学号可为整型或字符型: 年龄应为整型:性别应为字符型:成绩可为整型或实型. 显然不能用一个数组来存放这一组数据. 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理.为了解决这个问题,C语言中给出了另一种构造数据类型--"结构". 它相当于其它高级语言中的记录. "结构"是一种构造类型,它是由若干"成员"组成的. 每一个成员可

C语言学习教程第七章-结构与联合(6)

creat函数用于建立一个有n个结点的链表,它是一个指针函数,它返回的指针指向stu结构.在creat函数内定义了三个stu结构的指针变量.head为头指针,pf 为指向两相邻结点的前一结点的指针变量.pb为后一结点的指针变量.在for语句内,用malloc函数建立长度与stu长度相等的空间作为一结点,首地址赋予pb.然后输入结点数据.如果当前结点为第一结点(i==0),则把pb值 (该结点指针)赋予head和pf.如非第一结点,则把pb值赋予pf 所指结点的指针域成员next.而pb所指结点为

C语言学习教程第七章-结构与联合(4)

这三种用于表示结构成员的形式是完全等效的.结构数组指针变量结构指针变量可以指向一个结构数组, 这时结构指针变量的值是整个结构数组的首地址. 结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址.设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素. 这与普通数组的情况是一致的.[例7.7]用指针变量输出结构数组.struct stu{int num;char *name;char sex;float sco

C语言学习教程第七章-结构与联合(3)

结构数组 数组的元素也可以是结构类型的. 因此可以构成结构型数组.结构数组的每一个元素都是具有相同结构类型的下标结构变量. 在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体.如一个班的学生档案,一个车间职工的工资表等. 结构数组的定义方法和结构变量相似,只需说明它为数组类型即可.例如: struct stu{int num;char *name;char sex;float score;}boy[5]; 定义了一个结构数组boy1,共有5个元素,boy[0]-boy[4].每个数组元

C语言学习教程第七章-结构与联合(2)

在ANSI C中除了允许具有相同类型的结构变量相互赋值以外, 一般对结构变量的使用,包括赋值.输入.输出. 运算等都是通过结构变量的成员来实现的. 表示结构变量成员的一般形式是: 结构变量名.成员名 例如:boy1.num 即第一个人的学号 boy2.sex 即第二个人的性别 如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用.例如:boy1.birthday.month 即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同. 结构变量的赋值 前面已经介绍,结构变量的赋值就是

C语言学习教程第三章-C语言程序设计初步(1)

C语言程序设计 本课介绍C语言程序设计的基本方法和基本的程序语句.从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构.分支结构.循环结构. 这三种基本结构可以组成所有的各种复杂程序.C语言提供了多种语句来实现这些程序结构. 本章介绍这些基本语句及其应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础. C程序的语句 C程序的执行部分是由语句组成的. 程序的功能也是由执行语句实现的.C语句可分为以下五类:1.表达式语句2.函数调用语句3.控制语句4.复合语句5.空语句 1.表

C语言学习教程第四章-数组(1)

数 组 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组.在C语言中, 数组属于构造数据类型.一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型.因此按数组元素的类型不同,数组又可分为数值数组.字符数组.指针数组.结构数组等各种类别. 本章介绍数值数组和字符数组,其余的在以后各章陆续介绍.数组类型说明 在C语言中使用数组必须先进行类型说明. 数组说明的一般形式为: 类型说明符 数组名 [常量表达式],