C语言程序设计 - 结构体和共用体-样本教案
- 格式:doc
- 大小:100.00 KB
- 文档页数:12
说明:先引用当前p所对应的成员a,引用完后,p移动
一个单位.
第二组引用:对成员变量s的引用
*p->s*(p->s)
说明:引用s所指向的内存单元.
*p->s++
说明:先引用s所指向的内存单元,然后指针s移动一个单位.
注意:s每移动一个单位要移动多少字节?
(*p->s)++
说明:指针s所指的内存单元存储的数值自增1.
思考与练习
结构体与共用体第二讲
内容
说明
主要
内容
重点
难点
举例
结论
说明
引例
1.结构体变量在函数中的应用
2.利用结构体变量构成链表
3.共用体
通过举例说明定义结构体变量的指针。
在主函数中声明了struct student类型,然后定义struct student类型的变量stu_1
又定义了一个指针变量p
它指向一个
{"Wang wu" , "F",1983, 3, 3,93,83,73,63}
};
有时结构数组长度可以省略,而由初值个数来暗示.
(4)结构变量成员的引用和操作:
1)对结构变量成员的引用和操作:
三种引用形式:
结构体变量名.成员名
适用于普通结构变量和结构数组变量
例:
std.sex="F";
std.sc[0]=91;
这种结构类型变量定义的方式与不省略"结构名"的方式相比,不同之处在于:这种格式定义结构变量以后无法再定义此结构类型的其它结构变量,而带有"结构名"的格式则可以.
格式三: 使用typedef说明一个结构类型名,再用新类型名定义结构变量.
例:
typedefstruct
{ char name[12];
char sex;
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
} pers[3]={ {"Zhang san","M",1981,1,1,91,81,71,61},
{"Li si" , "M" , 1982 , 2 , 2 , 92,82,72,62},
例:
pstd->sex='M';(*psd).sex='M';
pstd->sc[2]=87;(*pstd).sc[2]=87;
gets(pstd->name);gets((*psd).name);
scanf("%d",&pstd->birthday.day);
scanf("%d",&(*pstd).birthday.day);
(2)向函数传递结构变量
结构变量整体作实参
单向数值传递
接收者(形参)为同类型的结构变量
执行时,系统会为形参开辟同样数量的内存空间来存放接收到的数据
不会影响对应的实参中的各成员值.
函数返回值可以是以下情况,但通常为1):
1)结构变量整体例: P195例14.2
2)某成员变量的值
3)无返回值
(3)向函数传递结构变量地址
*p++->s*(p++->s)
说明:先引用s所指向的内存单元,然后指针p移动一
个单位.
3)相同类型的结构变量之间整体赋值
例:
struct
{int a;
int b;
}per1,per2={2,3};
per1=per2;
注意:
整体赋值时,要保证"="两边的结构变量的结构类型相同.
小结
本讲主要通过二维表引出了结构体类型,然后讲解了结构体类型的结构类型定义、结构体变量定义、结构体变量的内存占用情况以及对结构体数据的正确引用。
结构变量的地址作实参
单向地址传递
接收者(形参)为同结构类型的指针变量
执行时,会影响对应的实参中的各成员值
返回值可以是以下情况,但通常为1)和2):
1)无返回值例1: P195例14.1 ;例2: P196例:14.4
pstd1=&std;/*pstd1指向结构变量std的首地址*/
pstd2=pers;/*pstd2指向结构数组pers的首地址*/
pstd3=(struct student*)malloc(size of (struct student));
说明:结构变量名不是指向该结构的地址, 这与数组名的含义不同,
4)"成员变量名"是构成结构的每一个成员变量的名称,相当于数据库二维表中的各字段名.
例1:
struct date
{int year;
int month;
int day;
};
例2:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
pers[1].sc[2]=67;
puts(per[2].name);
scanf("%c",&per[0].sex);
printf("%d-%d",std.birthday.year, std.birthday.month);
结构指针变量名->成员名
(*结构指针变量名).成员名
适用于指向结构类型的指针变量
12个
字节
1个
2个
2个
2个
4个
4个
4个
4个
结构数组变量如:struct student pers[3];
该结构数组包括3个元素,相当于3个普通结构变量,系统为该结构数组变量分配内存时,分配连续的3个与普通结构变量std所占内存空间大小相等的内存空间.
如下图所示:
perspers[0] pers[1]per[2]
sturct date birthday;
float sc[4];
}STD_GRADE;
STD_GRADEstd,pers[3],*pstd;
说明:
这里STD_GRADE为用户定义的一个结构类型的类型名.
因此可用它来定义结构变量,而不再需要关键字sturct了.
结构体数组和数值型数组不同之处在于每个数组元素都是一个结构体类型的数据。
结构类型说明的一般格式为:
比较
举例
struct 结构名
{
类型名1成员变量名1;
类型名2成员变量名2;
...
类型名n成员变量名n;
}
说明:
1)"struct"是关键字,是结构类型的标志;
2)"结构名"是用户所说明的结构类型的名称的标识符,而不是变量名,以后可用它来定义结构变量.
3)"类型名"为以前所讲的各种数据类型(int, char等),也可以是已说明的结构类型。
}
在C语言中,结构类型可以嵌套定义,所以以上两例可以合并为:
struct student
{ char name[12];
char sex;
struct date
{ int year;
int month;
int day;
} birthday;
float sc[4];
}
(2)结构变量的定义及结构变量的内存分配:
1)结构变量的定义
象其它类型的变量一样,在使用结构变量时要先对其定义。结构变量可以是普通结构变量,结构数组,和结构指针等形式.
定义结构变量有三种格式,现分别举例说明:
先声明一个
Struct date
类型,然后在定义Structstudent类型时,将成员
Birthday定义为Struct date类型。
18
88
chengde
如果将num、name、sex、age、score、addr分别定义为互相独立的简单变量,难以反映它们之间的内在联系,如何解决此类问题呢?
一、结构体类型引入
处理这样的二维表数据时,通常以记录为单位进行处理,而每条记录中包含多种数据类型,按以前所讲的数据类型没有办法处理。故引入了结构类型。即将多个基本类型作为一个集体定义成一种新的用户自定义类型。例:
相当于建立数据库二维表的表结构.
step2:用所定义的结构类型定义结构变量(记录变量);
相当于为数据库二维表的各记录定义一个记录名.
step3:通过所定义结构变量(记录变量)访问对应记录中的成员.
相当于编辑数据库二维表的记录中的各项.
(1)结构类型的说明:
在Turbo C中, 结构也是一种数据类型,但不同二维表所对应的结构不同,故在使用前需要对结构情况进行说明,即结构类型的说明.
.所赋初值用{}括起.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
}std={"Zhang san","M",1981,7,3,91,81,71,61};
2)给结构数组变量赋初值:
要求:参考数组一章.
普通结构变量:std;
结构数组变量:pers[3];
指向该结构类型的指针变量:*pstd.