第十一章zrr语言.docx
《第十一章zrr语言.docx》由会员分享,可在线阅读,更多相关《第十一章zrr语言.docx(8页珍藏版)》请在冰豆网上搜索。
![第十一章zrr语言.docx](https://file1.bdocx.com/fileroot1/2023-2/1/73dc5c4a-1a88-4cae-961d-253e6844a5ef/73dc5c4a-1a88-4cae-961d-253e6844a5ef1.gif)
第十一章zrr语言
第十一章结构体
在实际问题中,一组相关数据往往具有不同的数据类型,显然不能用一个数组来存放这组数据。
因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。
为了解决这个问题,C语言中给出了另一种构造数据类型——“结构体”。
它相当于其它高级语言中的记录。
11.1概述
“结构体”是一种构造数据类型,它是由若干“成员”组成的。
每一个成员可以是一个基本数据类型或者又是一个构造类型。
既然结构体是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。
如同在说明和调用函数之前要先定义函数一样。
声明一个结构体的一般形式为:
struct结构体名
{成员表列};
注意:
在花括号后的分号是不可少的。
成员列表由若干个成员组成,每个成员都是该结构的一个组成部分。
对每个成员也必须作类型说明,其形式为:
类型说明符成员名;
也可以把成员列表称为域表,每一个成员称为结构体的一个域。
成员名的命名应符合标识符的命名原则。
例如:
structstu
{intnum;
charname[20];
charsex;
floatscore;
};
结构体定义之后,即可进行变量说明。
凡说明为该结构体类型的变量都由该结构体的成员组成。
由此可见,结构体是一种复杂的数据类型,是数目固定,类型不同的若干变量的集合。
11.2结构类型变量的定义
定义结构体类型的变量有以下三种方法。
以上面定义的stu为例来加以说明。
⒈先定义结构,再说明结构变量。
格式为:
struct结构体名变量名列表;
例如:
structstu
{intnum;
charname[20];
charsex;
floatscore;
};
structstuboy1,boy2;
⒉在定义结构类型的同时说明结构变量。
格式为:
struct结构体名
{成员列表}变量名列表;
例如:
structstu
{intnum;
charname[20];
charsex;
floatscore;
}boy1,boy2;
⒊直接说明结构变量。
格式为:
struct
{成员列表}变量名列表;
例如:
struct
{intnum;
charname[20];
charsex;
floatscore;
}boy1,boy2;
说明:
⑴类型与变量在概念上的区别。
⑵结构体中的成员可以单独使用,类似于普通变量。
⑶结构体的成员也可以是结构体类型的变量。
structdate
{intyear;
intmonth;
intday;};
structstu
{intnum;
charname[20];
charsex;
floatscore;
structdatebirthday;
structstu*next;
}girl1,girl2;
girl1.next=&girl2
⑷成员名可以与程序中其他的变量名相同。
11.3结构体变量的引用
对于结构体变量的引用,要通过成员运算符“.”,逐个访问其成员,其格式为:
结构体变量名.成员
其中的“.”是成员运算符,优先级最高,具有左结合性。
引用规则为:
⑴不能把一个结构体变量作为一个整体输入或者输出,只能对它的各个成员分别进行这样的操作。
例如:
printf(“%d,%s,%c,%f\n”,boy1.num,
boy1.name,boy1.sex,boy1.score);
floattemp;
scanf(“%f”,&temp);
boy1.score=temp;
⑵如果成员本身又是一个结构体变量,则必须逐级使用成员运算符,向下找到最低级的成员才能使用它。
例如:
scanf(“%d,%d,%d”,&girl.birthday.year,&girl.birthday.month,&girl.birthday.day);
⑶根据成员本身的数据类型,可以对它进行各种适合的操作。
例struc1.c
⑷可以引用结构体变量或其成员的地址,多用做函数参数,传递结构体的地址。
Struct2.c
11.4结构体变量的初始化
结构体变量的初始化与一维数组相似,使用初值表来进行。
其格式为:
结构体变量名={初值表};
如果某一个成员本身又是一个结构体类型的变量,那么它的初值就是一个初值表。
例如:
structstu
girl={100,”LiHua”,’F’,81,{1980,6,23}},*temp;temp=&girl;temp->num;
11.5结构体数组
数组元素也可以是结构体类型的。
因此可以构成结构体数组。
结构体数组的每一个元素都是具有相同结构体类型的下标结构体变量。
在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。
⒈结构体数组的定义
与定义结构体类型变量一样,也可以有三种方式。
⒉结构体数组的初始化
结构体数组的初始化是在定义的数组的后面加上“={初值表}”
如果对全部元素都初始化的话,可以省略数组的长度。
例如:
structstu
{intnum;
charname[20];
charsex;
floatscore;
}boy[5]={{101,"Liping",’M’,45},
{102,"Zhangping",’M’,62.5},
{103,"Hefang",’F’,92.5},
{104,"Chengling",’F’,87},
{105,"Wangming",’M’,58}};
⒊举例
例1:
计算学生的平均成绩和不及格的人数。
Liz1.c
liz2.c
11.6指向结构体类型数据的指针
一个结构体变量的指针就是该变量所占据的内存空间的起始地址。
⒈指向结构体变量的指针
⑴定义方法
struct结构体名*指针变量名
⑵使用方法
(*结构体指针变量).成员名
结构体指针变量–>成员名
其中–>是指向运算符,具有左结合性,优先级最高,功能是得到指针变量所指向的结构体变量的成员的值。
structstuboy,*p=&boy;
boy.num(*p).nump->num
注意:
①使用前必须先令指针变量指向一个确定的结构体变量。
②成员运算符的优先级高于指针运算符,所以第二种使用方法中的括号不能省略。
⒉指向结构体数组的指针
定义方法与定义指向普通数组的指针变量相似。
使用时要注意:
①如果p指向数组中的某一个元素,则p+1是指向该数组中的下一个元素的,依然是一个结构体类型的变量。
②(p++)->num表示先得到当前元素的num成员的值,再使p指向下一个元素。
(++p)->num表示使p指向下一个元素,并得到它的num成员的值。
③定义p是指向某一个结构体变量的指针变量,则p可以指向属于该数据类型的任何变量,但不可以令p指向该变量中某一个具体的成员,因为该成员不一定是结构体类型的。
见p291
⒊做函数参数
将一个结构体变量的值传递给另一个函数,可以有三种方法:
⑴用结构体变量的成员做参数,使用方法与普通变量一样。
⑵用结构体变量做参数,此时形参与实参必须都是同一结构体类型的变量。
⑶用指向结构体变量的指针做参数,形参与实参必须类型一致,实参把地址传递给形参。
Liz3.c
11.7用指针处理链表
链表是一种重要的数据结构,它是动态进行存储分配的一种结构,是动态进行存储分配的一种结构。
1.链表由一系列的节点构成,每个节点的数据由2部分构成,包括数据部分和指针部分分别用来存放实际数据和下一个节点的地址。
2.可能会有一个头节点用来记录第一个节点的地址。
11.7.2简单链表
#defineNULL0
main()
{
structstudent
{
intnum;
structstudent*next;
}a,b,c,*p;
a.num=101;a.next=&b;
b.num=102;b.next=&c;
c.num=103;c.next=NULL;
p=&a;
while(p)
{
printf(“%d”,p->num);
p=p->next;
}
}
11.7.3处理动态链表所需要的函数
malloc(unsignedsize)
在内存中开辟一个长度为size的存储空间,并且返回空间的起始地址,如果失败则返回NULL。
calloc(unsignedn,unsignedsize)
在内存中开辟n个长度为size的存储空间,并且返回空间的起始地址,如果失败则返回NULL。
free(*p)释放指针变量p所指向的存储空间。