清华大学出版社 TSINGHUA UNIVERSITY PRESS 第十一章 结袍体与类用体
第十一章
清华大学出版社 TSINGHUA UNIVERSITY PRESS ●本章要点 结构体的定义\引用和初始化(1--5) 链表的概念和操作\建立\输出(6-7)
⚫ 本章要点 ◼结构体的定义\引用和初始化(1--5) ◼链表的概念和操作\建立\输出(6-7)
清华大学出版社 TSINGHUA UNIVERSITY PRESS §11.1概述 有时要将具有内在联系的多个不同类型的 数据组合成一个整体以便于引用。如 学生”stu1”的学号/姓名/性别/年龄/地址等 int num; char name[20]; char sex int age; int char addr30 若能用 stul num, student1age访问 Num name sex age score addr 100101Li Fun M 18 87.5 Beijing 图11-1
§11.1 概述 ◼ 有时要将具有内在联系的多个不同类型的 数据组合成一个整体以便于引用。如: 学生”stu1”的学号/姓名/性别/年龄/地址等 int num; char name[20]; char sex; int age; int char addr[30]; 若能用stu1.num,student1.age…访问 图11-1 100101 Li Fun M 18 87.5 Beijing Num name sex age score addr
清华大学世版 struct student TSINGHUA UNIVERSITY PRESS 结构体类型 成员类型 int num; char name 20: char sex 结构体 变量 nt age; float score; CIdri[30 };/不能丢此处表类型定〉结构体 struct student stu 1 成员 结构体包含结构体类型与结构体变量两层含义, 前者只声明结构体在内存中的存储结构;后者是结构体 类型的具体实例,编译系统只有定义了结构体变量后才 为会根据结构体类型为结构体变量分配内存空间
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };/*分号不能丢,此处表类型定义完毕*/ struct student stu_1 结构体类型 成员类型 结构体 成员 结构体包含结构体类型与结构体变量两层含义, 前者只声明结构体在内存中的存储结构;后者是结构体 类型的具体实例,编译系统只有定义了结构体变量后才 为会根据结构体类型为结构体变量分配内存空间 结构体 变量
§11.2结构体类型与结构体变量的定义 (1)先定义结构体类型,后定义结构体变量 struct student{…} struct student student 1. student2 (2)定义结构体类型的同时定义结构体变量 struct date int year; int month; int day )date l, date2 (3)直接定义结构体类型变量 struct i int num; char name 201; char sex float score struct date birthday;/成员也可以是结构体类型*/ 3 student, student2;
§11.2 结构体类型与结构体变量的定义 (1)先定义结构体类型,后定义结构体变量 struct student {…}; struct student student1, student2; (2)定义结构体类型的同时定义结构体变量 struct date { int year; int month; int day; }date1,date2; (3) 直接定义结构体类型变量 struct { int num; char name[20]; char sex; float score; struct date birthday;/*成员也可以是结构体类型*/ }student1,student2;
清华大学出版社 TSINGHUA UNIVERSITY PRESS §11.3结构体变量的引用 (1)使用成员运算符引用结构体变量的成员: 结构体变量名.成员名 studentI num=10010; scanf(%d, &student1 num) printf( %od,, studentI num) 注:不能将结构体变量作为整体输入和输出,如 scanf("%d"&student1)t!
§11.3结构体变量的引用 (1)使用成员运算符引用结构体变量的成员: 结构体变量名.成员名 student1.num=10010;scanf(“%d”,&student1.num); printf(“%d”, student1.num); 注:不能将结构体变量作为整体输入和输出,如 scanf(″%d″ ,&student1)错!
(2)使用指针运算符和成员运算符引用结构体变量的成员。如 truct student stu, p=&stu (p).num=10001; scanf("%s"', (*p). name); scanf(%f, p) score) (3)使用指向运算符“→”引用结构体变量的成员。如 struct student stu, *p=&stu p->num=10001; scanf(%s", p->name); scanf(%f, &p->score): printf("age of %oS is %d\n, stul. name, age) (4)将结构体变量作为一个整体进行操作。如 stu2=stul printf( the address of struct student variable stu2 is %x, ,&stu2); struct student stu l, stu2, *p=&stul 【说明】(1)与“->”优先级相同,都高于指针运算符“*”。 (2)“(*p)成员名”、“p>成员名”与“stu成员名”等 价 思考:“(*p)成员名”中括号能省略吗? 语言程序设计(第三版)‖http:/iCcf.tsinghua.edu.cn7
C语言程序设计(第三版) http://ccf.tsinghua.edu.cn 7 (2)使用指针运算符和成员运算符引用结构体变量的成员。如 struct student stu,*p=&stu; (*p).num=10001;scanf(“%s”,(*p).name);scanf(“%f”,&(*p).score); (3)使用指向运算符“->”引用结构体变量的成员。如 struct student stu,*p=&stu; p->num=10001; scanf(“%s”, p->name); scanf(“%f”,&p->score);printf(“age of %s is %d\n”,stu1.name,age); (4)将结构体变量作为一个整体进行操作。如 stu2=stu1; printf(“the address of struct student variable stu2 is %x”, &stu2); struct student stu1,stu2,*p=&stu1; 【说明】(1) “.”与 “->” 优先级相同,都高于指针运算符“*”。 (2) “(*p).成员名”、“p->成员名”与“stu.成员名”等 价 思考: “(*p).成员名”中括号能省略吗?
114结构体变量的初始化: 定义结构体变量的同时为各成员赋值。如 struct student stul=(1001,lisi",M,1988,,103,5801 struct student stu2=(1002, LiPing, F, 1989, 2, 5, 595) struct student stu=(1002, Li Ping",F, 1989) 说明】(1)不初始化则结构体变量各成员的取值是随机的 (2)花括号内初值的顺序、类型要与结构体成员的顺 序和类型一致 语言程序设计(第三版)‖http:/iCcf.tsinghua.edu.cn8
C语言程序设计(第三版) http://ccf.tsinghua.edu.cn 8 11.4结构体变量的初始化: 定义结构体变量的同时为各成员赋值。如: struct student stu1={1001,“lisi",'M',{1988,8,10},580}; struct student stu2={1002,"Li Ping",'F',1989,2,5,595}; struct student stu3={1002,"Li Ping",'F',1989}; 【说明】(1)不初始化则结构体变量各成员的取值是随机的。 (2)花括号内初值的顺序、类型要与结构体成员的顺 序和类型一致
清华大学出版社 TSINGHUA UNIVERSITY PRESS 例110对结构体变量初运行结果 #include No.10101 void main () name: LiLin I struct student seX: M (long int num; address: Beijing Road char name [20] char sex: char addr [20] }a={10101,” LiLin”,’M’," Beijing road″ };对结构体变量a赋初值 printf("No: %1d\nname: %s\sex: %c\address: %s\n a num, a name, a sex, a addr); J
但不能用以下语句整体读入结构体变量, 例如: scanf(″%d,%s,%c,%d,%f,%s″, &student1); 结构体变量的地址主要用作函数参数, 传递结构体变量的地址。 例11.1 对结构体变量初始化. #include void main() { struct student {long int num; char name[20]; char sex; char addr[20]; }a={10101,”LiLin”,’M’,″Beijing Road″ }; /* 对结构体变量a赋初值*/ printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n ” ,a.num,a.name,a.sex,a.addr); } 运行结果: No.:10101 name:LiLin sex:M address:Beijing Road
清华大学出版社 TSINGHUA UNIVERSITY PRESS 结构体程序举例 【例10.1】输入一个学生的信息并显示 #include void maino struct date int year; int month; int day; i struct student (int num; char name[20]; char sex struct date birthday; float score, struct student stu printi("请输入学生学号:"); scanf("%d", &stu num); printi("请输入学生姓名:) scanf("%s", stu name) printf("清请输入学生出生日期:"); scanf("%d%d%od",&stu birthday year, &stu birthday. month, &stu birthday day) printf("学号%dⅦn姓名%sn出生日期%%d月%d日n", stu num, stu name, stu birthday year, stu birthday. month, stu birthday day, stu score); 结构体在函数内部定义则只在本函数内部有效!
结构体程序举例 【例10.1’】输入一个学生的信息并显示 #include void main() { struct date{int year;int month;int day;}; struct student{int num;char name[20];char sex;struct date birthday;float score;}; struct student stu; printf("请输入学生学号:"); scanf("%d",&stu.num); printf("请输入学生姓名:"); scanf("%s",stu.name); printf("请输入学生出生日期:"); scanf("%d%d%d",&stu.birthday.year,&stu.birthday.month,&stu.birthday.day); printf("学号:%d\n姓名:%s\n出生日期:%d年%d月%d日\n", stu.num,stu.name, stu.birthday.year,stu.birthday.month,stu.birthday.day,stu.score); } 结构体在函数内部定义则只在本函数内部有效!