C语言教程第8章结构体.ppt
《C语言教程第8章结构体.ppt》由会员分享,可在线阅读,更多相关《C语言教程第8章结构体.ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第8 8 8 8章章章章 结构体结构体结构体结构体 结构体结构体 共用体共用体2023/1/161Functions and Program Structure2思考一个问题思考一个问题 在程序里表示一个人的信息(姓名、年龄、性在程序里表示一个人的信息(姓名、年龄、性在程序里表示一个人的信息(姓名、年龄、性在程序里表示一个人的信息(姓名、年龄、性别、别、别、别、),怎么表示?),怎么表示?),怎么表示?),怎么表示?表示多个人呢?表示多个人呢?表示多个人呢?表示多个人呢?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?如何用计算
2、机程序实现下述表格的管理?表表8-1 某学校学生成绩管理表某学校学生成绩管理表学学学学号号号号姓名姓名姓名姓名性性性性别别别别入学时间入学时间入学时间入学时间计算机原计算机原计算机原计算机原理理理理英英英英 语语语语数数数数 学学学学音音音音 乐乐乐乐1 1令狐冲令狐冲令狐冲令狐冲男男男男1999199990908383727282822 2林平之林平之林平之林平之男男男男1999199978789292888878783 3岳灵珊岳灵珊岳灵珊岳灵珊女女女女1999199989897272989866664 4任莹莹任莹莹任莹莹任莹莹女女女女1999199978789595878790905
3、5 6 6 3数组的解决方法数组的解决方法int studentId30;/*最多可以管理最多可以管理30个学生个学生,每每个学生的学号用数组的下标表示个学生的学号用数组的下标表示*/char studentName3010;char studentSex302;int timeOfEnter30;/*入学时间用入学时间用int表示表示*/int scoreComputer30;/*计算机原理课的成绩计算机原理课的成绩*/int scoreEnglish30;/*英语课的成绩英语课的成绩*/int scoreMath30;/*数学课的成绩数学课的成绩*/int scoreMusic30;/*音
4、乐课的成绩音乐课的成绩*/4数组的解决方法数组的解决方法intint studentId30=1,2,3,4,5,6;studentId30=1,2,3,4,5,6;charchar studentName3010=studentName3010=令狐冲令狐冲令狐冲令狐冲,林平之林平之林平之林平之,岳灵珊岳灵珊岳灵珊岳灵珊,任莹莹任莹莹任莹莹任莹莹;charchar studentSex302=studentSex302=男男男男,男男男男,女女女女,女女女女;intint timeOfEnter30=1999,1999,1999,1999;timeOfEnter30=1999,1999,19
5、99,1999;intint scoreComputer30=90,78,89,78;scoreComputer30=90,78,89,78;intint scoreEnglish30=83,92,72,95;scoreEnglish30=83,92,72,95;intint scoreMath30=72,88,98,87;scoreMath30=72,88,98,87;intint scoreMusic30=82,78,66,90;scoreMusic30=82,78,66,90;5数组的解决方法数组的解决方法 数据的内存管理方式数据的内存管理方式 907889788392729572889
6、887827866901234令狐冲令狐冲林平之林平之岳灵珊岳灵珊任莹莹任莹莹男男男男女女女女19991999199919996数组的解决方法数组的解决方法 分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理结构显得比较零散,不容易管理 7希望的内存分配图希望的内存分配图 1令狐冲令狐冲男男1999908372822林平之林平之男男1999789288783岳灵珊岳灵珊女女1999897298664任莹莹任莹莹女女1999789587908结构体的解决方法结构体的解决方法 struct STU
7、DENT struct STUDENT int studentID;/*int studentID;/*每个学生的序号每个学生的序号每个学生的序号每个学生的序号*/char studentName10;/*char studentName10;/*每个学生的姓名每个学生的姓名每个学生的姓名每个学生的姓名*/char studentSex4;/*char studentSex4;/*每个学生的性别每个学生的性别每个学生的性别每个学生的性别*/intinttimeOfEnter;/*timeOfEnter;/*每个学生的入学时间每个学生的入学时间每个学生的入学时间每个学生的入学时间*/intint
8、scoreComputer;/*scoreComputer;/*每个学生的计算机原理成绩每个学生的计算机原理成绩每个学生的计算机原理成绩每个学生的计算机原理成绩*/intintscoreEnglish;/*scoreEnglish;/*每个学生的英语成绩每个学生的英语成绩每个学生的英语成绩每个学生的英语成绩*/intintscoreMath;scoreMath;/*/*每个学生的数学成绩每个学生的数学成绩每个学生的数学成绩每个学生的数学成绩*/intintscoreMusic;/*scoreMusic;/*每个学生的音乐成绩每个学生的音乐成绩每个学生的音乐成绩每个学生的音乐成绩*/;struc
9、t STUDENT是一个类型是一个类型struct STUDENT students4;students0.studentNamestudents0.Sex它们都是变量,一般称为结构的成员变量它们都是变量,一般称为结构的成员变量98.1 结构体的定义结构体的定义 结构体类型的定义结构体类型的定义 结构体类型变量的引用结构体类型变量的引用 结构体变量的初始化结构体变量的初始化10struct studentint num;char name20;char sex;int age;char addr30;;是数据类型,不是变量名是数据类型,不是变量名对各成员都要进行类型说明;对各成员都要进行类型说
10、明;成员名定名规则与变量名同。成员名定名规则与变量名同。一、结构体类型的定义一、结构体类型的定义 一般形式为:一般形式为:struct 结构体名结构体名 成员表列成员表列;11方法一:先定义结构体类型再定义变量名方法一:先定义结构体类型再定义变量名方法一:先定义结构体类型再定义变量名方法一:先定义结构体类型再定义变量名struct studentstruct studentint num;int num;char name20;char name20;char sex;char sex;int age;int age;char addr30;char addr30;;struct studen
11、tstruct student student1,student2;student1,student2;定义定义studet1和和sudent2为为struct student类型变量类型变量结构体类型变量的定义结构体类型变量的定义 12有时,可用符号常量代表一个结构体类型有时,可用符号常量代表一个结构体类型,如:,如:#definedefine STUDENTSTUDENT struct studentstruct studentSTUDENTSTUDENTint num;int num;char name20;char name20;char sex;char sex;int age;in
12、t age;char addr30;char addr30;这样,可直接用这样,可直接用STUDENT定义变量,如:定义变量,如:STUDENT student1,student2;此时,不必再写关键字此时,不必再写关键字struct13方法二:在定义类型的同时定义变量方法二:在定义类型的同时定义变量struct studentstruct studentint num;int num;char name20;char name20;char sex;char sex;int age;int age;char addr30;char addr30;student1,student2;stude
13、nt1,student2;一般形式是:一般形式是:struct 结构体名结构体名 成员列表成员列表 变量名列表;变量名列表;14方法三:直接定义结构类型变量。其一般形式是:其一般形式是:其一般形式是:其一般形式是:structstruct 成员表列成员表列成员表列成员表列 变量名表列;变量名表列;变量名表列;变量名表列;此时,不出现结构体名此时,不出现结构体名15typedef 的用法的用法 功能:定义新类型功能:定义新类型,即为即为C语言中已有的数据类型语言中已有的数据类型 名定义一个新名字。名定义一个新名字。定义格式:定义格式:typedef 标识符标识符1 标识符标识符216struct
14、 student int num;char name20;char sex;int age;float score;char addr30;typedef struct student STUD;STUD student1,student2;用用typedef为已存在的类型定义新名字为已存在的类型定义新名字用用STUD代替代替 struct student类型;类型;17几点说明:1.类型与变量是不同概念,不要混淆;类型与变量是不同概念,不要混淆;2.结构体中的成员,可以单独使用,结构体中的成员,可以单独使用,其作其作 用与地位相当于普通变量;用与地位相当于普通变量;3.成员名可以与程序中的变
15、量名相同,成员名可以与程序中的变量名相同,二二 者不代表同一对象。者不代表同一对象。18struct date int month;int day;int year;Struct studentint num;char name20;int age;struct date birthday;student1,student2;4.成员也可以是一个结构体变量;成员也可以是一个结构体变量;例如:例如:19规则:规则:1.1.不能将一个结构体变量作为一个整体进行赋值和不能将一个结构体变量作为一个整体进行赋值和不能将一个结构体变量作为一个整体进行赋值和不能将一个结构体变量作为一个整体进行赋值和输出;只
16、能对其各个成员分别输出输出;只能对其各个成员分别输出输出;只能对其各个成员分别输出输出;只能对其各个成员分别输出printf(“.”,student1);printf(“.”,student1);printf(“%d”,student1.num);printf(“%d”,student1.num);错!错!正确!正确!引用形式为:引用形式为:结构体变量名结构体变量名.成员名成员名 二、结构体类型变量的引用203.3.对成员变量可以象普通变量一样进行各种运算,对成员变量可以象普通变量一样进行各种运算,对成员变量可以象普通变量一样进行各种运算,对成员变量可以象普通变量一样进行各种运算,如:如:如:
17、如:sumage=student1.age+student2.age;sumage=student1.age+student2.age;4.4.可以引用成员的地址,也可以引用结构体变量的可以引用成员的地址,也可以引用结构体变量的可以引用成员的地址,也可以引用结构体变量的可以引用成员的地址,也可以引用结构体变量的地址地址地址地址,如如如如 scanf(“%d”,&student1.num);scanf(“%d”,&student1.num);printf(“%x”,&student1);printf(“%x”,&student1);scanf(“%d,%s,%c,%d,%s”,&student1
18、);scanf(“%d,%s,%c,%d,%s”,&student1);错!错!错!错!输入输入student1.num的值的值输出输出student1的首地址的首地址2.若成员本身又属一个结构体类型,只能对最低级的若成员本身又属一个结构体类型,只能对最低级的 成员进行赋值或存取以及运算。成员进行赋值或存取以及运算。如:如:21(一)对外部存储类型的结构体变量初始化(一)对外部存储类型的结构体变量初始化(一)对外部存储类型的结构体变量初始化(一)对外部存储类型的结构体变量初始化:struct studentstruct studentlong int num;long int num;char
19、 name20;char name20;char sex;char sex;char addr20;char addr20;a=9801,”Wang hong”,W,”2 Linggong Road”;a=9801,”Wang hong”,W,”2 Linggong Road”;main()main()printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr);a.num,a.name,a.sex,a.addr);运行结果为:
20、运行结果为:No.:9801name:Wang hongsex:Waddress:2 Linggong Road三、结构体变量的初始化22main()main()static struct studentstatic struct student long int num;long int num;char name20;char name20;char sex;char sex;char addr20;char addr20;a=9801,”Wang hong”,W,”2 Linggong Road”;a=9801,”Wang hong”,W,”2 Linggong Road”;printf
21、(“No.:%ldnname:%snsex:%cnaddress:%sn”,printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr);a.num,a.name,a.sex,a.addr);(二)对静态存储类型的结构体变量初始化(二)对静态存储类型的结构体变量初始化23(一)结构体数组的定义一)结构体数组的定义 struct studentint num;char name20;char sex;int age;char addr30;struct studnt stu3;也可直接定义,如也可直接定义,如stru
22、ct student int num;stu3;或或struct int num;stu3;8.2 结构体数组结构体数组(每个数组元素都是一个结构体类型的数据每个数组元素都是一个结构体类型的数据)24struct studentstruct studentint num;int num;char name20;char name20;char sex;int age;char sex;int age;char addr30;char addr30;stu3=111,”Li”,M,18,”Dalian”,;stu3=111,”Li”,M,18,”Dalian”,;结构体数组结构体数组 初始化的一
23、般形式是在初始化的一般形式是在定义数组后面加上:定义数组后面加上:=初值表列初值表列;也可采用:也可采用:struct student int num;struct student stu=,;(二)结构体数组的初始化(只能对全局的或静态存(二)结构体数组的初始化(只能对全局的或静态存(二)结构体数组的初始化(只能对全局的或静态存(二)结构体数组的初始化(只能对全局的或静态存储储储储 类别的数组初始化)类别的数组初始化)类别的数组初始化)类别的数组初始化)25struct personstruct person char name20;char name20;int count;int cou
24、nt;leader3=“Li”,0,”zhang”,0,”Liu”,0;leader3=“Li”,0,”zhang”,0,”Liu”,0;main()main()int i,j int i,j;char leader_name20;char leader_name20;for(i=1;i=10;i+)for(i=1;i=10;i+)scanf(“%s”,leader_name);scanf(“%s”,leader_name);for(j=0;j3;j+)for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;if(s
25、trcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)for(i=0;ip-成员名成员名成员名成员名指向运算符。其优先级高指向运算符。其优先级高于自增、自减运算符于自增、自减运算符试分析以下运算:试分析以下运算:成员运算符成员运算符得到得到p指向的结构体变量中的成员指向的结构体变量中的成员n的值的值使其先加使其先加1+(p-n)得到得到p指向的结构体变量中的成员指向的结构体变量中的成员n的值,的值,用完后使它加用完后使它加1;(p-n)+得到得到p指向的结构体变量中的成员指向的结构体变量中的成员n的值的值p-n28for(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 教程 结构
限制150内