版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章结构体与共用体自定义类型标识符结构体的定义与引用共用体的定义与引用10.1自定义类型标识符一般格式:typedef原类型名新类型名例如: typedefintINTEGER;typedeffloatREAL;所以有:inti;floatx;INTEGERi;REALx;等价于
typedefintARRAY[100];ARRAYa,b,c;又如:inta[100],b[100],c[100];等价1、先按定义变量的方法写出定义语句;
如:inta[10];2、将变量名用新类型名替换; 如:intARRAY[10];3、在最前面加typedef;
如:typedefintARRAY[10];4、然后可以用新类型名定义变量。 如:ARRAYa,b,c;定义一个新类型的步骤1)用typedef可以定义各种类型名,但不能用来定义变量。2)用typedef只能为已经存在的数据类型标识符另起一个新名,而不能创造一种新类型。3)要注意typedef与#define的区别,如:
typedefintSUM;
#defineSUMint注意:
数组可以表示一组类型相同的数据。在实际中,通常需要通过一组不同类型的数据共同来描述某个实体。如:学生个人资料(学号、姓名、性别、年龄和学习成绩)。
C语言提供的结构体就是这样一种数据类型,它由一组称为成员(域或元素)的数据成分组成,其中每个成员可以具有不同的类型,用来存放类型不同但又相互有关的数据。
结构体类型:是一种C语言没有定义、用户可以根据实际需要自己定义的构造型数据类型。10.2结构体的定义与引用struct结构体类型标识符{
类型名1结构成员名表1;类型名2结构成员名表2;
……
类型名n结构成员名表n;};如:描述学生基本信息
structstudent{intnum;
charname[20];
charsex;
intage;
floatscore;
};结构体数据类型说明的一般格式inta[3];numnamesexagescore成员的组织结构
是变量,会分配相应的空间是类型名10.2.2结构体类型变量、数组和指针变量的定义方法1:先定义结构体类型,再定义结构体变量如:structstudent{intnum;
charnume[20];
charsex;
intage;
floatscore;
};
structstudentstd,*pstd,pers[3];方法2:在定义结构体类型的同时定义结构体变量如:
structstudent{intnum;
charname[20];
charsex;
intage;
floatscore;}std,*pstd,pers[3];numnamesagescorestdpers10.2.2结构体类型变量、数组和指针变量的定义方法4:使用typedef说明一个结构体类型名,然后用新类型名定义变量方法3:直接定义结构体变量如:struct{intnum;
charnume[20];
charsex;
intage;
floatscore;
}std,*pstd,pers[3];如:typedefstructstudent{intnum;
charname[20];
charsex;
intage;
floatscore;
}STREC;STREC
std,*pstd,pers[3];10.2.2结构体类型变量、数组和指针变量的定义typedefstructstudent{intnum;
charname[20];
charsex;
intage;
floatscore;
}STREC;STRECstd,*pstd,pers[3];结构体变量的存储情况:在内存中,结构体变量std占据一片连续的存储空间,该空间的首地址为&std
结构体数组pers在内存中占一片连续空间,该空间被等分成3分,每一份用于保存一个结构体数组元素结构体指针变量pstd在内存中占一个存储单元,它将保存某个STREC类型变量的地址。如pstd=&std;结构体类型和结构体变量结构体类型说明可以嵌套。
structdate{intmonth,day,year;};structstudent{intnum;
charnume[20];
charsex;
intage;
structdatebirthday;
floatscore;
};structstudent{intnum;
charname[10];
charsex;
intage;
structdate {intyear; intmonth; intday; }birthday;
floatscore;
};10.2.2结构体类型变量、数组和指针变量的定义10.2.3给结构体变量、数组和指针变量的初始化1、结构体变量的初始化例如:structstudentstd={20001,"LiLi",’M’,19,85};结构体变量名={初值};初值的个数、顺序、类型应与成员说明一致2、结构体类型数组的初始化struct结构体类型标识符结构体数组名={初值};例如:structstudentpers[2]={{20001,"LiLi",’M’,19,85}{20002,"Wuan",’F’,19,78}};3、结构体指针的初始化struct结构体类型标识符*指针变量名=&结构体变量名;
例如:structstudentstd,*sp=&std;10.2.3给结构体变量、数组和指针变量的初始化10.2.4结构体类型变量、数组和指针变量的引用1、对结构体成员的引用结构体变量名.成员名
(*指针变量名).成员名指针变量名->成员名std.num=10101;等价于sp->num=10101;std.sex=’M’;等价于(*sp).sex=’M’;std.score=75+8;等价于(*sp).score=75+8;std.age++;等价于sp->age++;如:structstudent{longnum;
charname[20];
charsex;
intage;
floatscore;}std,pers[5],*sp=&std;(1)结构体类型数组和结构体成员数组:数组元素下标的引用原则结构体类型成员的引用原则引用结构体成员时要注意以下几点:structstudent{longnum;
charname[20];
charsex;
intage;
floatscore;}std,pers[5],*sp=&std;[2]或sp->name[2]或(*sp).name[2]。不能写作,因为name是数组名。pers[0].age或(pers+0)->age或(*(pers+0)).age。注意:不能写成pers.age。numnamesagescoreperspers[0](2)对于结构体嵌套的情况,只能引用最低层的成员。std.birthday.month或sp->birthday.month或(*sp).birthday.month。structdate{intmonth,day,year;};structstudent{intnum;
charnume[20];
charsex;
intage;
structdatebirthday;
floatscore;
}std,*sp=&std;引用结构体成员时要注意以下几点:取结构体变量的地址为:
&结构体变量名如:&std取结构体成员的地址为:
&结构体变量名.成员名如:&std.agestructstudent{longnum;
charname[20];
charsex;
intage;
floatscore;}std,pers[5],*sp=&std;(3)可以用“&”对结构体类型变量、数组元素及其成员进行取地址运算了。引用结构体成员时要注意以下几点:(4)请分析并理解以下几种运算structstudent{longnum;
charname[20];
charsex;
intage;
floatscore;}std,pers[5],*sp=&std;例如有赋值语句:sp=pers;++sp->num与++(sp->num)等价sp->num++与(sp->num)++等价(++sp)->num(sp++)->num(5)采用(*sp).num方式引用成员num时,(*sp)两侧的括号不能省略。引用结构体成员时要注意以下几点:(6)根据定义,指针变量sp只能指向一个结构体类型数据,而不能指向结构体类型数据中的某一成员例如,下面是不对的:sp=&pers[2].num引用结构体成员时要注意以下几点:10.2.4结构体类型变量、数组和指针变量的引用structstudent{longnum;
charname[20];
charsex;
intage;
floatscore;}std,pers[5],*sp=&std;【例10.1】结构体类型变量的引用示例。#include"stdio.h"main(){structstudent{1ongnum;
charname[20];
charsex;
floatscore;
}s1={20001,"LiLi",’M’,85};
structstudents2;
floatsum,ave;
scanf("%ld%s%c%f",&s2.num,,&s2.sex,&s2.score);
sum=s1.score+s2.score;
ave=sum/2;
printf("%ld%s%c%5.1f\n",s1.num,,s1.sex,s1.score);
printf("%ld%s%c%5.1f\n",s2.num,,s2.sex,s2.score);
printf("sum=%5.1fave=%5.1f\n",sum,ave);}【例10.3】指向结构体变量的指针变量的应用。main(){structstudent{1ongnum;
charname[20];
floatscore;
};
structstudentstu1,*sp;
sp=&stu1;
stu1.num=20001;
strcpy(,"LiLi");
stu1.score=85;
printf("%ld%ld%ld\n",stu1.num,(*sp).num,sp->num);
printf("%s%s%s\n",stu1.name,(*sp).name,sp->name);
printf("%5.2f%5.2f%5.2f",stu1.score,(*sp).score,sp->score);}【例10.4】结构体类型数组指针变量的引用示例。structstudent{longnum;
charname[20];
floatscore;
};structstudentstu[3]={{20001,“LiLi”,85},
{20002,“Wuan”,78},
{20003,“MaLin”,69}};main(){structstudent*p;
printf("No\tName\tscore\n");
for(p=stu;p<stu+3;p++)
printf("%ld\t%s\t%f\n",p->num,p->name,p->score);}2.对结构体类型变量的整体赋值允许两个具有同一种类型的结构体变量之间进行整体赋值操作。例如有以下定义:structstudent{1ongnum;
charname[20]:
charsex;
intage;
floatscore;}std1,std2={11011,“YangLin”,’M’,18,89};则在程序中,可以用赋值语句:std1=std2;这样实际上是将std2中各个成员的值分别赋给了std1中对应的同名成员。10.2.5函数之间结构体变量的数据传递在函数之间传递结构体类型数据有三种方法用结构体变量的成员作参数
c语言允许将结构体变量的成员象普通变量一样传递给一个函数.10.5统计一个班及格学生的人数main(){intcount();intj,ok=0;
structstudent{intnum;charname[20];intscore;}stu[3];for(j=0;j<3;j++)scanf("%d%s%d",&stu[j].num,stu[j].name,&stu[j].score);for(j=0;j<3;j++)ok+=count(stu[j].score);printf("Theresultis:%d\n",ok);}intcount(intx){intm=0;if(x>=60)m=1;return(m);}0aaa231sss962xxx8510.6用指向结构体的指针变量作函数参数示例structstudent{intnum;charname[20];intscore;}main(){voidprint(structstudent*p);structstudentstu;stu.num=12345;strcpy(,"LILI");stu.score=67.5;print(&stu);}voidprint(structstudent*p){printf("NO.=%d,NAME=%s,SCORE=%d",p->num,p->name,p->score);printf("\n");}10.7用整个结构体变量作为函数参数structstudent{intnum;charname[20];intscore;}main(){voidprint(structstudentp);structstudentstu;stu.num=12345;strcpy(,"LILI");stu.score=67.5;print(stu);}voidprint(structstudents1){printf("NO.=%d,Name=%s,Score=%d",s1.num,,s1.score);printf("\n");}练习1.若有以下说明和定义typedefint*INTEGER;INTEGERp,*q;以下叙述正确的是()。A.p是int型变量B.p是基类型为int的指针变量C.q是基类型为int的指针变量D.程序中可用INTEGER代替int类型名2.以下选项中,能定义s为合法的结构体变量的是()。A.typedefstructabcB.struct{doublea;{doublea;
charb[10];charb[10];
}s;}s;C.structABCD.typedefABC{doublea;{doublea;
charb[10];charb[10];
}}ABCs;ABCs;
3.设有以下定义语句typedefstruct{intn;
charch[8];
}PER;则下面叙述中正确的是()。
A.PER是结构体变量名
B.PER是结构体类型名
C.typedefstruct是结构体类型
D.struct是结构体类型名
4.设有以下定义structss{charname[10];
intage;
charsex;
}std[3],*p=std;下面各输入语句中错误的是()。
A.scanf(“%d”,&(*p).age);
B.scanf("%s",&);
C.scanf(“%c”,&std[0].sex);
D.scanf("%c",&(p->sex));上节回顾structstudent{intnum;
charname[20];
};
structstudentstd,sp[2];
charname[20];inti;numnamestdspname...std.num,,namescanf(“%d%d”,&std.num,&i);scanf(“%s%s”,,name);1、共用体的概念共用体是指不同类型的数据可以在不同的时间内使用共同的内存单元。共用体实际上是c语言提供的一种覆盖技术。10.3共用体charsexintnumfloatscore10.3.1共用体的定义和使用
“共用体”类型变量的定义形式为:
union共用体名
{类型名1共用体成员名表1;类型名2共用体成员名表2;
……
类型名n共用体成员名表n;
};unionstudent
{intnum;
charsex;
floatscore;
}stu1,stu2;charsexintnumfloatscore也可以将类型定义与变量定义分开,例如:
unionstudent
{intnum;
charsex;
floatscore;
};unionstudentstu1,stu2;charsexintnumfloatscore3、共用体变量的引用方式共用体的使用也与结构体相同,用&取共用体的地址,用“.”或“-〉”访问共用体成员。例如:
stu1.num(引用共用体变量中的整型变量num)
stu1.sex(引用共用体变量中的字符变量sex)
stu1.score(引用共用体变量中的实型变量score)1、同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医养生馆医师聘用协议
- 美容院仪器管理规范
- 加油站停车场租用合同
- 艺术品交易中介费
- 旅游业超龄导游服务承诺书
- 石油项目部勘探员聘用协议
- 山西省电力设施建设合同模板
- 住宅装修翻新装饰改造协议
- 跨境电商平台投标技巧
- 2022年大学海洋工程专业大学物理下册期中考试试卷A卷-附解析
- 无线电基础知识课件
- 翼腭窝解剖医疗培训课件
- 我不生气了-完整版课件
- 区域经济发展战略课件
- 思想道德与法治教案第三章:继承优良传统弘扬中国精神
- 中国高考评价体系说明
- 2022届高考语文专题复习 专题04 文言文阅读(原卷版+解析版)
- 2022病媒生物防制知识PPT(蚊、蝇、蟑螂、鼠的危害及防治学习培训课件)
- DB32T 3957-2020 化工企业安全生产信息化管理平台数据规范
- 《灵敏素质练习》教案
- 中国文化英语教程Unit-3
评论
0/150
提交评论