结构体与共用体

文档属性

名称 结构体与共用体
格式 zip
文件大小 30.6KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2010-09-16 19:30:00

图片预览

文档简介

(共30张PPT)
本章重点
13.1 结构体类型
13.2 共用体
第13章 结构体、共用体和用户自定义类型
13.1 结构体类型
C语言的基本数据类型有整型,实型,字符型等,在实际问题中,把一个对象抽象成数据来表示时,往往需要一组不同基本数据类型的组合。
例如,一辆银灰色的车牌号为湘A00001的雪弗兰轿车以80km/h的速度行驶。
在这里由车牌、车名、型号、车速共同构成了对一辆轿车的描述,在数据处理中,这四个属性应该当作一个整体来处理。但它们不属于同一类型,无法用数组来容纳,而用单个变量来分别代表各个属性,又难以反映出它们的内在联系。
C语言提供结构体(structure)数据结构,将不同数据类型、但相互关联的一组数据,组合成一个有机整体使用。
13.2.1 结构体类型的说明
结构体类型说明的一般形式是:
struct 结构体标识名
{ 类型名1 结构成员名表1;
类型名2 结构成员名表2;

类型名n 结构成员名表n;
};
结构类型说明的形式如下:
strcut 结构类型名
{ 数据类型 成员1;
  数据类型 成员2;
    ……  ……  ;
  数据类型 成员n;
};
也可以表述成如下形式:
struct 结构体名
{ 分量表 };
一、 结构体类型的说明
(1) struct是结构类型关键字,“结构体名”和“成员名”都是用户自定义的标识符。
(2)结构体名用来唯一标识该结构体,可以省略不写。
(3)结构体中所含的成员个数,可以是任意多个。结构体中的成员名可以和程序中的其它变量同名,不同结构中的成员也可以同名。
(4)结构体要以分号结束
struct student
{ char name[20];
char sex;
int age;
float score;
};
例如:定义学生档案信息结构类型:
成员表列
struct是类型关键字
后分号不能少,表明语句结束。
结构体名
name
sex
age
score
struct date struct student
{ int month; { int num ;
int day; char name[20]
int year; char sex ,
}; int age ;
struct date birthday;
char addr[30];
} ;
num
name
sex
age
birthday
month
day
year
addr
结构类型student的 “birthday”数据项可以是一个已经定义的结构类型date
num
name
sex
age
birthday
month
day
year
addr
结构体可以嵌套说明,即在结构体说明里再说明另外一个结构
13.1.2 结构体类型的变量的定义
定义结构类型变量由以下四种方法:
1.直接在结构体类型说明之后定义结构体变量。
这种形式说明的一般形式为:
struct 结构名
{成员表列
}  变量名表列;
例如:
struct student
{ char name[10]; char sex;
int age; float score;
} s1, *ps, stu[3];
2.直接说明结构变量。即在结构变量定义中省去了结构类型名,而直接给出结构变量。一般形式为:
struct
{成员表列
} 变量名表列;
例如以上结构中把student省略,
struct
{ char name[10]; char sex;
int age; float score;
} s1, *ps, stu[3];
3.先定义结构,再说明结构变量。例如:
struct student
{ char name[10]; char sex;
int age; float score;
};
struct student s1, *ps, stu[3];
4.使用typedef说明一个结构体类型名,再用新类型名来定义变量。例如:
 typedef struct
{ char name[10]; char sex;
int age; float score;
} STU;
 STU s1,*ps, stu[3];
  此处STU是一个具体的结构体类型名,它能够唯一的标识这种结构体类型。因此,可用它来定义变量,不可再写关键字struct。
13.2.3 结构体类型变量的赋值
(1)结构体变量赋初值
和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。
struct Student
{ int number;
char name[31];
short age;
char sex;
char grade;
} boy2, boy1 = {1361, "zhang", 12, 'm', '5'};
(2)结构体数组赋初值
规则和给数组赋值一样,只是结构体数组中的每个元素都是一个结构体变量,所以赋初值的时候,都必须吧每个数组元素的各个成员的值依次放在一对花括号中,以便区分各个元素。
struct Student
{ char name[31];
short age;
char sex;
float score;
} stu[3]= {{“Jim”,’M’, 20,59},{“Sam”,’W’,21,78},{“Bill”,’M’,22,85}};
13.2.4 结构体类型的变量的引用
1. 对结构体成员的引用
引用结构变量成员的三种形式是:
结构变量名.成员名
结构体指针变量 成员名
(*结构体指针变量).成员名
 
struct student
{ int num ;
char name[20]
char sex ,
int age ;
struct date
{
int year;
int mon;
int day;
} birthday;
float grade[3];
float score;
}s1,*ps,s[3];
ps=&s1;
(1)若要引用结构体变量s1中的age成员,可写作:s1.age;ps->age;(*ps).age;
(2)引用结构体数组元素的成员,可写成s[0].age.在这里,s数组的每一个元素可以简单地看做是一个结构体变量。
(3)访问结构体中的数组成员,比如访问s1中的grade数组,则可以写成s1.grade[0]。
(4)若结构体中的字符数组存放的是字符串,则可以对其数组名直接引用,如s1.name、ps->name等。
(5)嵌套定义的结构体变量成员的引用:在结构体说明中,某成员变量又是一个结构体变量,若要引用其成员,可以一级一级的找到最低一级的成员。
例如,s1.birthday.year;
对结构体变量中的成员进行操作
结构体变量中的每个成员都属于某个具体的数据类型,因此,要操作结构体中的成员,可以采用操作普通变量的方式来对结构体成员进行输入和输出。
(1)对结构体变量中的整型age成员进行输入输出。
输入:scanf(“%d”,&s1.age);
scanf(“%d”,&s[0].age);
scanf(“%d”,&ps->age);
输出:printf(“%d”,s1.age);
printf(“%d”,ps->age);
(2)对结构体变量中的字符串name成员进行输入和输出
输入:scanf(“%s”,s1.name);gets(s1.name);
输出:printf(“%s”,s1.name);puts(s1.name);
(3)对结构体成员变量birthday的成员year操作
输入:scanf(“%d”,&s1.birthday.year);
scanf(“%d”,&s[0].birthday.year);
输出:printf(“%d”,s1.birthday.year);
printf(“%d”.s[0].birthday.year);
3. 通过指针变量来引用结构体成员
当通过指针变量来引用结构体成员,并且与++等运算符组成表达式时,应当根据运算符的优先级来确定表达式的含义。
例如,struct {
int a; char * s;
}x,*p=&x;
++p->a; ++(p->a)
(p++)->a p++->a
*p->s *p->s++ (*p->s)++ *p++->s
13.2.5 函数之间结构体变量的数据传递
在函数调用中,可以把结构体变量、结构体变量的成员、地址、结构体成员的地址等等作为函数传递的实参,函数可以返回结构体类型值和结构体类型指针。规则与前面所讲内容一致。
(1)向函数传递结构体变量的成员。
(2)向函数传递结构体变量
(3)传递结构体变量的地址 例13.10
(4)向函数传递结构体变量成员的地址 例13.11
(5)函数的返回值可以是结构体类型或返回值是指向结构体变量的指针,即当做基本类型看待。
13.2.6 用结构体构成链表
(1)结构体中含有指向本结构体类型的指针成员。结构体中的成员可以是各种类型的数据。那么,当结构体中有一个或多个成员指针,且它们的基类型就是本结构体类型时,通常把这种结构体称为“引用自身的结构体”。例如,
struct link
{
char data;
struct link *next;
};
typedef struct link LINK; p120 例13.12
LINK a;
a.next=&a;
(2)建立链表,以及顺序访问链表中各结点个数可以是任意多个,可以根据需要在程序中动态的分配多个结点。
见p121 例13.13
13.2 共用体
   共用体的类型说明和使用方法与结构体完全相同,共用体与结构体的唯一区别是:结构体的各成员都有自己的内存存储单元,结构体类型占用存储空间的总字节数,即为各成员所占字节数的总和;而共用体则不一样,在共用体中,各成员使用共同的存储单元,共用体占用存储空间的总字节数为共用体中占字节数最大的那个成员的存储字节数。
struct memb
{ float v;
int n;
char c;
} sa1;
sa1占7个字 节内存空间
union memb
{ float v;
int n;
char c;
} usa2;
usa2占4个字节内存空间
1001
1005
1007
v
n
c
2001
v
n
c
2002
2003
2004
共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。
13.2.1 共用体类型的说明和变量定义
1.共用体类型说明
 共用体类型说明的一般形式为:
union 共用体标识名
{ 类型名1 共用体成员名1;
类型名2 共用体成员名2;
 …
 类型名n 共用体成员名n;
};
例如:
union un
{
int i;
char c;
float f;
}u1; //u1所占的字节数为其成员f的字节数,即为4个字节。
  说明:
union为关键字,是共用体类型的标志。
共用体表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量。
在内存单元中,所有成员具有相同的首地址,并且重叠在一起。共用体中的成员可以是简单变量,也可以是数组、指针、结构体和共用体。
2. 共用体变量的定义
与结构体变量的定义方法相同,共用体变量的定义也有4种方式。采用一种方式举例如下:
union un_1
{
int a;
char c;
float fd;
}un=66;
说明:
(1)共用体变量在定义的同时只能用第一个成员的类型值进行初始化。
(2)由于共用体变量中的所有成员共享存储空间,依次所有成员的首地址相同,变量的地址就是该变量的所有成员的地址。
13.3.2 共用体变量的引用
1.共用体变量中成员的引用
  可以使用以下三种形式引用共用体变量中的成员:
(1)共用体变量名.成员名
(2)指针变量名->成员名
(3)(*指针变量名).成员名
例如,
union un
{
int i;
char c;
float f;
}u1;
则引用以下成员:u1.i=20; u1.c=getchar(); scanf(“%f”,&un.f);
共用体中的成员变量可参与其所属类型允许的任何操作。但在访问共用体成员时应注意,共用体变量中起作用的是最近一次存入的成员变量值,原有成员变量的值将被覆盖。
2.共用体变量的赋值
   不能在定义公用体变量时对它初始化。对共用体变量赋值必须针对其成员进行,不能直接对共用体变量赋值,不过在ANSI C中允许具有相同类型的共用体变量相互赋值。例如:
 union cif_ty cif1, cif2;
 cif = 10;
 cif1.i = 10;
 cif2 = cif1;
   共用体变量的地址和它的各个成员的地址都一样,公用体数组的地址和它的第一个成员的地址一样。
3.向函数传递共用体变量的值
   同结构体变量一样,共用体类型的变量可以作为实参进行传递,也可以传送共用体变量的地址。
例13.14 利用共用体类型的特点分别取出int变量中高字节和低字节中的两个数。
p124 例13.14
同课章节目录