2022年C语言程序设计教程(第3版) 谭浩强 课件 最新 7

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以采用不同的方法定义一个结构体类型的变量。 (1)在定义了一个结构体类型之后,把变量定义为该类型。如 有以下声明:
struct Student stdnt1, stdnt2, stdnt3;
• 定义了stdnt1、stdnt2,和stdnt3三个struct Student类型的结构 体变量。注意不能写成:
num; name[20]; sex; age; score; addr[30];
这样就定制了一种strict的数据类型struct Student。这里, Student是数据类型名,前面的struct表明它是一种结构体类 型。同样的方法可以为建立通信录定制一种数据类型struct Addr:
truct Addr {
• 仔初始化时,按照所定义的结构体类型的数据结构,依次写 出各初始值,在编译时就将它们赋给此变量中各成员。
• 7.1.3 结构体变量的操作 • 1. 结构体变量间的赋值
C语言允许两个同类型的结构体变量之间相互赋值。可以将 一个结构体变量作为一个整体赋给另一个具有相同类型的结 构体变量。例如:
• 例7.1
/* 注意这个头部没有类型名 */
num; name[20]; sex; age; score; addr[30];
• 此时只是按照花括弧内的结构,直接定义了stdnt1, stdnt2和 stdnt3student三个变量,并没有定义此结构体类型的名字。因 此无法用结构体类型名再定义其它变量。
• (3)在声明一个结构体类型的同时定义一个或若干个结构体变 量。如:
char char char char unsigned int }
name[30]; street[40]; city[20]; provn[20]; zip;
/* 姓名 */ /* 街道 */ /* 城市 */ /* 省名 */ /* 邮编 */
• 说明:
• (1)结构体类型并非只有一种,而可以有千千万万种,这是 与基本类型不同的。如果说i为整型变量,那是很明确的,它 占2个字节,按定点形式存放,而说x是结构体类型变量,那 就不明确了,它由哪些数据项组成,占多少字节?因此光讲 “结构体类型”,只是一个笼统的类型,它只表示了“由若 干不同类型数据项组成的复合类型”,程序中定义和使用的 应该是具体的有确定含义的结构体类型,需要程序员自己定 制。
• 注意:不允许用赋值语句将一组常量直接赋给一个结构体变 量。如下面语句不合法:
student1={50203,“WangLong“,19,’F’,89.5};
• 2. 引用结构体变量的成员
• 由于一个结构体变量是一个整体,要访问它其中的一个成员, 必须先找到这个结构体变量,然后再从中找到它其中的一个 成员。例如要访问结构体变量student1中的num,应写成以 下形式:
struct Student {
unsigned int char char int float char } stdnt1, stdnt2, stdnt3;
num; name[20]; sex; age; score; addr[30];
• 它的一般形式为:
struct 结构体名 { 成员声明表列 }变量名表列;
• (2)一个结构体类型的标志由两个单词组成:第一个单词为 关键字struct,它表明该类型是一种结构体类型;第二个单 词是结构体名,如前面介绍的Student、Add,也称为“标记” 或“符标”(flag),由程序设计者按标识符规则指定。这二者 联合起来组成一个“类型标识符”即“类型名”。
• (3)结构体的类型的含义由一些声明组成,它们定义了各成 员(或称域)的类型。要注意,它们并不是变量,而是一个 结构体类型中的成员,age,sex,num不能称为变量名,而是 结构体类型struct person的成员名。在一个函数中,可以另 外定义与结构体类型的成员相同名的变量,它们代表不同的 对象。例如:
• int、char、float、double等都是系统预定义的标准数据类型。程 序员用这些类型声明符声明需式进行存储,并在有关运算符作用于 这些数据时进行合法性检查。
• 除此之外,C语言还允许程序员在一定的框架范围内定制需要的数 据类型。声明了类型之后,程序员就可以使用它们来定义需要的变 量,如同使用系统提供的int、char、float、double等一样。
struct Student {
┇ char int ┇ }; int char ┇
sex; age;
age; sex;
/* 成员名 */ /* 成员名 */
/* 变量名 */ /* 变量名 */
这是允许的,下面将要看到对成员名和变量名有不同的引用 方法。
• (4)声明一个结构体类型,并不意味着系统将分配一段内存 单元来存放各数据项成员。请注意这是声明类型而不是定义 变量,声明一个类型只是表示这个类型的结构,即告诉系统 它由哪些类型的成员构成,各占多少个字节,各按什么形式 存储,并把它们当作一个整体来处理。应当明确,只声明类 型是不分配内存单元的,例如系统声明了int,float等类型,但 并不具体分配内存单元,它只反映一种数据属性,是对具体 数据的“抽象”。正如同说“汽车是车”,车就是一种“抽 象”,世界上只有具体的汽车、自行车、卡车、…,把“有 轮子的、在地上走动的、有一定运载能力的”特征抽象为 “车”。人们只有拥有具体的汽车或自行车…,才算拥有该 财产。同样,一种类型只表明一种特征,如果以后定义变量 为该类型,该变量应当具备这种特征,只有在定义变量以后, 才占据存储单元。
printf (“student2: %u,%s,%c,%u,%5.2f\n”, student2.num,\
,student2.sex,student2.age,student2.score);
return 0;
}
• 运行情况如下:
• 在执行“student2=student1;”这个赋值语句时,将 student1变量中各个成员逐个依次赋给student2中相应各个 成员。显然,这两个结构体变量的类型应当相同才行。
·枚举(enumeration):用一组符号代替一组整数。
·typedef:用于为已经存在的类型定义新名字。
• 本章介绍这些有关知识和方法。
7.1 结构体类型基础
• 7.1.1 结构体类型及其定制 • 1. 结构体类型的概念
• 通过前面的学习,已经看到了使用数组这样的构造数据类型可 以将多个数据用一个名字命名,为存储和处理带来很大方便。但是, 现实生活中还存在着大量需要作为一个整体来处理的数据,而这些 数据的类型又不相同。例如:要处理学籍数据,需要处理学生学号 (num)、姓名(name)、性别(sex)、年龄(age)、成绩 (score)和地址(addr)等数据。这样一组相互关联的数据,用简 单变量存储,难以反映出它们的内在联系的,而且使程序冗长难读; 而数组则无法容纳不同类型的元素。结构体(structure),也称 “结构”,就是C语言提供的处理一组不同类型数据的类型。但是 这种类型是需要用户自己进行定制的,因为处理学生的结构体形式 与处理教师的结构体形式不同,处理人的结构体形式与处理企业、 处理产品、处理公文等的结构体形式各不相同,等等。因此,在结 构体的大框架内,还要根据需要具体地定制自己的结构体类型。
• (5)系统没有预先声明结构体类型,凡需使用结构体类型数 据的,都必须在程序中自己定义。
• 7.1.2定义结构体类型变量及对变量的初始化 定制一个结构体类型后,得到一个结构体类型名。有了这个类
型名,就可以像int、char、float和double一样,用来定义一些结 构体类型的变量。定义了变量,系统就会为变量分配存储空间。 • 1. 定义结构体变量
struct Student ,stdnt1, stdnt2, stdnt3; /* 错误逗号 */
• 也不能写成:
Student stdnt1, stdnt2, stdnt3;
/* 缺少关键字struct */
• (2)直接定义结构体类型的变量。如:
struct {
unsigned int char char int float char } stdnt1, stdnt2, stdnt3;
sizeof (struct Student)
• 或使用表达式
sizeof (stdnt1)
• 2. 结构体变量的初始化 在定义了结构体变量之后,stdnt1, stdnt2, stdnt3等就具有 struct Student结构体类型的特征 ,也有了变量的特征。但 是,这些变量不是简单变量,它们的值也不是一个简单的整 数、实数或字符等,而是由许多个基本数据组成的复合的值。 例如,stdnt1、stdnt2和stdnt3的值可以有如图7.1所示的值。
student1.num
• 式中的圆点“.”称为成员运算符,意为从结构体变量 student1中找出中成员num的值。表达式 studen1.num=50201将把50201赋值给结构体变量student1 中的成员num。成员运算符的运算级别最高,例如: student.1.num+100,在num两侧有二个运算符,由于成员 运算符的运算优先于加号运算符,故相当于:
• 这种形式紧凑,既声明了类型,又定义了变量。如果需要再用 此struct Student定义其它变量,还可以用:
struct Student stdnt3, stdnt4, stdnt5;
• 再定义三个struct Student类型的变量。 定义后的变量,在程序运行时将内分配连续的一片存储单元。 可以用sizeof运算符测出一个结构体类型数据的长度,例如使用 表达式
struct Student student2;
student2=student1;
/* 结构体变量间赋值 */
printf (“student1: %u,%s,%c,%u,%5.2f\n”, student1.num,\
,student1.sex,student1.age,student1.score);
/***** ex070101 ***/
struct Student
{
unsigned int
num;
char
name[20];
char
sex;
unsigned char
age;
float
score;
};
#include <stdio.h>
int main(void)
{
struct Student student1={50201,“WangLi”,’M’,18,89.5};
• C语言允许程序员定制的数据类型是在下面的5种类型框架内进行。 这5种框架分别是:
·结构体(struct):也称集合数据类型,用于将不同类型的数据组 织在一个名字下。
·位域(bit field):结构体的一种变形,允许方便地访问字(word) 中的位(bit)。
·共用体(union):允许一个存储空间中存储不同类型的变量。
• 2. 结构体类型的定制 定制结构体类型,需要定义该结构体类型的名字以及声明组 成结构体的各成员,因此它是由声明成员的一组语句组成的, 形式为
struc 结构体名 {成员声明表列};
例如上述处理学籍的结构体类型定制语句为:
struct Student {
unsigned int char char int float char };
score;
char
addr[30];
} stdnt1={50201,”ZhangXi”,’M’,18,90.5,”Shanghai”},
stdnt2={50202,”WhangLi”,’F’,19,88.3,”Beijing”};
• 也可以用以下形式
Struct Student stdnt3={50203,”LiHong”,’M’,17,79.9,”Shanxi”};
• 那么,如何对结构体变量进行初始化呢? 与简单变量的初始化类似,结构体变量的初始化应当在变量定 义时进行,并且要把初始值依次写在一对花括号内,用赋值运 算符赋值给对应的变量。如
struct Student
{
unsigned int
num;
char
name[20];
char
sex;
int
age;
float
相关文档
最新文档