《第9章 结构体.ppt》由会员分享,可在线阅读,更多相关《第9章 结构体.ppt(28页珍藏版)》请在三一文库上搜索。
1、第9章 结构体,提出问题,在我们定义变量的时候,有时一些不同类型的变量需要组合成一个整体,便于引用 例如:我们要处理一个学生的信息,包括: 学号、姓名、性别、年龄、成绩、地址 按照以往定义变量的方式,我们可以这样定义:,int num; char name20; char sex; int age; float score; char addr50;,struct student ;,结构体,声明结构体类型,结构体是一种构造数据类型 其目的是:把不同类型的数据组成一个整体 属于用户自定义的数据类型,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ;,struct 是关键字
2、不能省略,合法标识符,可省略 省略时无结构体名,成员类型可以是基本数据类型 或构造数据类型型,需要说明的是: 定义结构体,不是定义变量, 而是定义一种数据类型 所定义的结构体类型与系统 提供的标准数据类型(int 、 float、double、char等) 具有同样的作用和地位,都 可以用来声明变量的类型 不同的是:结构体类型需要 用户自己指定,声明结构体类型,例如:,struct student int num; char name20; char sex; int age; float score; char addr30; ;,声明结构体类型,只是描述了该类型数据的组织形式 是对一种用户
3、自定义的数据类型的描述,并不占内存空间,student类型的变量,将按照这种结构在内存中分配空间 每个变量都占63个字节,声明结构体变量,定义结构体类型的变量有三种方式 先定义结构体类型,再定义结构体变量,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ; struct 结构体名 变量名表;,struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1, stu2;,stu1和stu2各占63个字节,声明结构体变量,定义结构体类型
4、的变量有三种方式 定义结构体类型的同时定义结构体变量,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; 变量名表;,struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2;,声明结构体变量,定义结构体类型的变量有三种方式 直接定义结构体变量,struct 类型标识符 成员名; 类型标识符 成员名; 变量名表;,struct int num; char name20; char sex; int age; float score; char addr
5、30; stu1, stu2;,用无名结构体直接定义 变量只能一次,声明结构体变量,定义结构体类型的变量有三种方式的比较: 第一种和第二种是等价的,struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2;,struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1, stu2;,这两种方式定义的结构体数据类型,可以做多次
6、声明,struct student stu3, stu4;,struct student stu3, stu4;,声明结构体变量,第三种声明方式只说明了要定义的结构体变量的组织形式 没有说明所定义的结构体类型名称,不能再次做变量声明,struct int num; char name20; char sex; int age; float score; char addr30; stu1, stu2;,struct int num; char name20; char sex; int age; float score; char addr30; stu1, stu2;,struct stu3
7、, stu4;,P,声明结构体变量,结构体类型与结构体变量概念不同 结构体类型:不分配内存,不能赋值、存取、运算 结构体变量:分配内存,能够赋值、存取、运算 结构体可嵌套,struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;,struct student int num; char name20; struct date int month; int day; int year; birthday; stu;,声明结构体变量,结构体成
8、员名与程序中变量名可相同,不会混淆,#include void main() struct student int num; char name20; stu; int num; num=0; stu.num=1; ,引用结构体变量,引用结构体变量的规则 结构体变量不能整体引用,只能引用变量成员 引用方式: 结构体变量名. 成员名,成员(分量)运算符 优先级:1 结合性:从左向右,struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2;,不能将结构体变量作为一个整体
9、进行输入或输出,但是可整体初始化,scanf(“%d, %s, %c, %d, %f, %s“, ,printf(“%d, %s, %c, %d, %f, %s“, stu2);,struct student stu3=101, “Jack“, M, 19, 87.5, “DaLian“;,P,#include void main() struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2 = 101, “Jack“, M, 19, 87.5, “DaLian“;
10、scanf (“%d, %s, %c, %d, %f, %s“, ,scanf (“%d, %s, %c, %d, %f, %s“, ,引用结构体变量,引用结构体变量的规则 结构体变量的成员可以进行该成员类型允许的所有运算,struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2 = 101, “Jack“, M, 19, 87.5, “DaLian“;,stu1.num = 100;,stu1.score = stu2.score + 10;,stu2.age +;
11、,strcpy(stu1.addr, stu2.addr);,引用结构体变量,引用结构体变量的规则 可以引用结构体变量的成员的地址,也可以引用结构体变量的地址,struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2 = 101, “Jack“, M, 19, 87.5, “DaLian“;,scanf(“%d“, ,printf(“%x“, ,printf(“%x“, ,引用结构体变量,引用结构体变量的规则 可以将一个结构体的值赋值给另一个结构体,#include
12、void main() struct student int num; char name20; char sex; int age; float score; char addr30; stu1, stu2 = 101, “Jack“, M, 19, 87.5, “DaLian“; stu1=stu2; printf (“%d, %s, %c, %d, %f, %sn“, stu2.num, stu2.name, stu2.sex, stu2.age, stu2.score, stu2.addr) ; printf (“stu1: %x, %xn“, ,101, Jack, M, 19, 8
13、7.500000, DaLian stu1: ff5e, ff5e stu2: ff9a, ffb7,ff9a+29,引用结构体变量,引用结构体变量的规则 当结构体的成员也是一个结构体类型时,需要使用多个成员运算符,一级一级找到最低的一级成员, 只能对最低级的成员进行赋值、存取及运算,#include void main() struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu=101, “Jack“, 1, 31, 1986; pri
14、ntf (“num: %dnname: %snbirthday: %d-%d-%dn“, stu.num, stu.name, stu.birthday.year, stu.birthday.month, stu.birthday.day) ; ,num: 101 name: Jack birthday: 1986-1-31,引用结构体变量,引用结构体变量的规则 不能直接判断两个同类型的结构体变量是否相等 必须判断其各成员,#include void main() struct student int num; char name20; stu1=101, “Jack“, stu2; stu2
15、 = stu1; if (stu2=stu1) printf (“stu2 = stu1“) ; else printf (“stu2 stu1“) ; ,Error 9: Illegal structure operation in function main,产生编译错误!,#include void main() struct student int num; char name20; stu1=101, “Jack“, stu2; stu2 = stu1; if (stu2.num=stu1.num ,stu2 = stu1,结构体数组,我们一共学习三种数组: 一般数组、指针数组、结构
16、体数组 结构体数组是指:数组中的元素都是结构体类型的数据 它们分别包括各自的成员项 三种定义形式:,定义形式1: struct student int num; char name20; char sex; int age; ; struct student stu2;,定义形式2: struct student int num; char name20; char sex; int age; stu2;,定义形式3: struct int num; char name20; char sex; int age; stu2;,结构体数组,结构体数组的初始化 顺序初始化,struct stude
17、nt int num; char name20; char sex; int age; ; struct student stu2 = 100, “Jack“ , M , 20, 100, “Marry“ , F , 19;,分行初始化,struct student int num; char name20; char sex; int age; ; struct student stu2 = 100, “Jack“ , M , 20, 100, “Marry“ , F , 19 ;,在全部初始化的时候,可以省略数组长度,struct student int num; char name20;
18、 char sex; int age; ; struct student stu = 100, “Jack“ , M , 20, 100, “Marry“ , F , 19 ;,结构体数组,结构体数组元素的应用 结构体数组名下标 . 成员名,struct student int num; char name20; char sex; int age; ; struct student stu2;,stu0.num=100;,strcpy(stu0.name, “Jack“);,stu1.age +;,结构体数组,统计候选人的选票: 定义结构体类型,其成员为候选人姓名和该候选人票数 定义该结构体
19、数组,包含3个元素,分别为3个候选人 读入所有投票中的姓名,若名字与某候选人相符,则将该候选人的票数成员分量加1 最终输出票数结果,#include void main() struct person char name20; int count; leader3 = “Jack“,0, “Marry“,0, “Tom“,0; int i, j, n=10; char name20; for ( i=1; i=n; i+ ) scanf(“%s“, name); for ( j=0; j3; j+) if (strcmp(name, leaderj.name)=0) leaderj.count
20、+; break; for ( j=0; j3; j+) printf(“%s: %dn“, leaderj.name, leaderj.count); ,Jack Jack Marry Jack Tom Marry Jack Marry Jack Jack ,Jack : 6 Marry: 3 Tom: 1,指向结构体类型数据的指针,指向结构体变量的指针 定义形式: struct 结构体名 * 结构体指针变量名;,指向结构体数据 存放结构体变量在内存的起始地址,struct student int num; char name20; char sex; int age; stu; struc
21、t student * p = ,指向结构体类型数据的指针,使用结构体指针变量引用结构体成员 结构体变量名.成员名 (*结构体指针名).成员名 结构体指针名-成员名,struct student int num; char name20; char sex; int age; stu; struct student * p = ,stu.num=100;,(*p).num = 101;,p - num = 101;,注意:“.“的优先级比“*“的高 * p . num * (p . num),指向运算符 优先级: 1 结合方向:从左向右,#include void main() struct
22、student int num; char name 20; char sex; float score; stu, * p = ,M 78 ,No: 101 Name: Jack Sex: M Score: 78.0,指向结构体类型数据的指针,使用结构体指针变量引用结构体成员 结构体变量名.成员名 (*结构体指针名).成员名 结构体指针名-成员名,struct student int num; char name20; char sex; int age; stu; struct student * p = ,p - age =20; printf(“Age: %dn“, p - age +
23、); printf(“Age: %dn“, + p - age);,Age: 20 Age: 22,指向结构体类型数据的指针,指向结构体数组的指针,#include void main() struct student int num; char name 20; char sex; float score; stu3= 101, “Jack“, M, 78, 102, “Marry“, F, 95, 103, “Tom“, M, 62 ; struct student * p = stu; printf(“No.tNametsextscoren“); for(; p num, p - name, p - sex, p - score); ,No. Name sex score,101 Jack M 78.00,102 Marry F 95.00,103 Tom M 62.00,第十章 结构体,主要内容 结构体类型的声明 结构体变量的定义 结构体数组 结构体指针的使用 要求掌握程序:例题,课外作业: P 一、单选题 P 二、填空题 P 三、读程序、写结果 上机题目:,作业,Thank You !,
链接地址:https://www.31doc.com/p-4333589.html