《第9章 构造数据类型.ppt》由会员分享,可在线阅读,更多相关《第9章 构造数据类型.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第 9 章章 构造数据类型构造数据类型2课时课时在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中:为更好地解决此类问题,语言采用构造数构造数据类型据类型,通过构造数据类型可以很好地将一些不同类型的数据作为一个整体进行处理。姓名:字符型;学号:整型或字符型;年龄:整型;性别:字符型;成绩:整型或实型。因为一个数组中只能存放同一种数据类型的数据,故不能用一个数组来存放这一组数据;如单独定义为互相独立的简单变量,难以反映它们之间的内在联系。9.1 结构体结构体“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型,或者又是一个构造类型。结构体类型的定义
2、结构体变量的说明结构体变量的引用 结构体先定义,后使用9.1 结构体结构体9.1.1结构类型定义和结构变量说明结构类型定义和结构变量说明 struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名成员名;.;成员类型可以是基本数据类型或构造数据类型struct是关键字,不能省略合法标识符可省:无名结构体一、结构体的定义 例 struct student int num;char name20;char sex;int age;float score;char addr30;namenumsexagescoreaddr4字节4字节20字节1字节4字节30字
3、节.结构体类型定义描述结构的组织形式,不分配内存n 结构是一种复杂的数据类型,是结构是一种复杂的数据类型,是数目固定数目固定,类型不类型不同同的的若干有序若干有序变量的集合。变量的集合。n 结构定义之后,即可进行变量说明。结构定义之后,即可进行变量说明。括号后的分号不可省括号后的分号不可省二、结构体变量说明(1)先定义结构体类型,再定义结构体变量一般形式:struct 结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;struct 结构体名结构体名 变量名表列;变量名表列;例#define STUDENT struct student STUDENT i
4、nt num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;(2)定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名表列变量名表列;例 struct st
5、udent int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;(3)直接定义结构体变量直接定义结构体变量一般形式:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名表列变量名表列;例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;用无名结构体直接定义变量只能一次w说明结构体类型与结构体变量概念不同类型类型:不分配内存;变量变量:分配内存类型类型:不
6、能赋值、存取、运算;变量变量:可以结构体成员名与程序中变量名可相同,不会混结构体可嵌套例 struct date int month;int day;int year;struct student int num;char name20;struct date birthday;stu;numnamebirthdaymonthdayyear例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu;numnamebirthdaymonthdayyear9.1.2 结构体变量的引
7、用引用规则 结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用引用方式:结构体变量名结构体变量名.成员名成员名例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;例 struct student int num;char name20;char sex;int age;float score;char
8、 addr30;stu1,stu2;printf(“%d,%s,%c,%d,%f,%sn”,stu1);()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”;()例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu2=stu1;()例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu1,stu2;numnamebirt
9、hdaymonthdayyearstu1.birthday.month=12;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;if(stu1=stu2).()成员(分量)运算符优先级:1结合性:从左向右从左向右练习1.设有以下语句:struct S char ch;int a4T;则下面叙述中正确的是()A.S是struct类型的变量 B.T是struct S类型的结构体变量C.可以用S定义结构体变量 D.可以用T定义结构体变量 练习2.设有如下定义:设有如下定义:s
10、truct sk int a;float sex;data;int*p;若要使若要使p指向指向data中的中的a域域,正确的赋值语句是正确的赋值语句是()Ap=&a;B.p=data.a;C.p=&data.a;D.*p=data.a struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名结构体名 结构体变量结构体变量=初始数据初始数据;例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 B
11、eijing Road”;二、结构体变量的初始化二、结构体变量的初始化形式一:形式一:形式二:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.结构体变量结构体变量=初始数据初始数据;例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;形式三:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.结构体变量结构体变量=初始数据初始数
12、据;例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;注:注:结构体变量是结构体变量是全局变量全局变量或或静态变量静态变量,才,才可对它进行初始化赋值,局部或自动结构体可对它进行初始化赋值,局部或自动结构体变量,不能进行初始化赋值。变量,不能进行初始化赋值。结构体变量的初始化结构体变量的初始化9.1.3 结构体数组结构体数组结构体数组的定义三种形式:形式一:struct student int num;char name20;char sex
13、;int age;struct student stu2;形式二:struct student int num;char name20;char sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu2;numnamesexagenumnamesexagestu0stu125B结构体数组初始化例 struct int num;char name20;char sex;int age;stu=,;顺序初始化:struct student int num;char name20;char sex;int age;st
14、ruct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;例 struct student int num;char name20;char sex;int age;stu=,;分行初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;全部初始化时维数可省结构体数组引用引用方式:结构体数组名结构
15、体数组名下标下标.成员名成员名 struct student int num;char name20;char sex;int age;str3;stu1.age+;strcpy(stu0.name,”ZhangSan”);练习1.设有如下定义:设有如下定义:main()struct complex int x;int y;num2=1,3,2,7;printf(“%dn”,num0.y/num0.x*num1.x);程序运行结果是程序运行结果是()A0 B.1 C.3 D.6 练习2.设有如下说明:设有如下说明:struct STD int n;char c;double x;以下选项中,能
16、正确定义结构体数组并赋初值以下选项中,能正确定义结构体数组并赋初值的语句是(的语句是()A.struct STD tt2=1,A,62,2,B,75;B.struct STD tt2=1,A,62,2,B,75;C.struct tt2=1,A,2,B;Dstruct tt2=1,A,62.5,2,B,75.0;w9.1.4 结构体和指针结构体和指针指向结构体变量的指针指向结构体变量的指针定义形式:定义形式:struct 结构体名结构体名 *结构体指针名结构体指针名;例例 struct student *p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexage
17、stupstruct student int num;char name20;char sex;int age;stu;struct student *p=&stu;(*结构体指针名).成员名结构体指针名-成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例 指向结构体的指针变量例 int n;int *p=&n;*p=10;n=10struct student stu1;struct student *p=&stu1;stu1.num=101;(*p).num=101 pnum=101main()struct student long int num;char name20;c
18、har sex;float score;stu_1,*p;p=&stu_1;stu_1.num=101;strcpy(stu_1.name,Li Lin);p-sex=M;p-score=89.5;printf(nNo:%ldnname:%sn sex:%cnscore:%fn,(*p).num,p-name,stu_1.sex,p-score);No:101Name:Li LinSex:MScore:89.500000指向结构体数组的指针例 指向结构体数组的指针struct student int num;char name20;char sex;int age;stu3=10101,Li
19、Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+110101 Li Lin M 1810102 Zhang Fun M 1910104 Wang Min F 20在上例中,可使用的是(*p).num这样的形式。(*p)表示p指向结构体变量,(*p).num是p指向的结构体变量中的成员num。注意:*p两侧的括弧不可省。请分析以下几种运算:p-np-n 得到p指向的结构体变量
20、中的成员n的值。p-n+p-n+p-n+p-n得到p指向的结构体变量中的成员n的值,用完该值后使它加1。得到p指向的结构体变量中的成员n的值使之加1(先加)。1.有以下程序:#include struct STU int num;float TotalScore;void f(struct STU p)struct STU s2=20044,550,20045,537;p.num=s1.num;p.TotalScore=s1.TotalScore;main()struct STU s2=20041,703,20042,580;f(s0);printf(%d%3.0fn,s0.num,s0.To
21、talScore);程序运行后的输出结果是()A.20045 537 B.20044 550 C.20042 580 D.20041 703 练习练习 值传递值传递2.以下程序运行后输出结果是(以下程序运行后输出结果是()。)。#include#includestruct STU char name10;int num;void f(char*name,int num)struct STU s2=SunDan,20044,Penghua,20045;num=s0.num;strcpy(name,s0.name);main()struct STU s2=YangSan,20041,LiSi,20
22、042,*p;p=&s1;f(p-name,p-num);printf(%s%dn,p-name,p-num);A)SunDan,20042 B)SunDan,20044 C)LiSi,20042 D)YangSan,20041 地址传递地址传递值传递值传递9.2 共用体u 1.定义 union 联合名 成员列表;u 2.存储:各成员共享一段内存空间;一个共用体变量的长度等于各成员中最长的长度。每次只能赋予一个成员值。struct char name10;char job;union int class;char office10;belong;body2;for(i=0;inext=q-next;B.p-next=p-next-next;C.p-next=r;Dp=q-next;