付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第十五部分结构体进阶2结构结构是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型结构类型定义struct[结构类型名]{
类型标识符成员名;类型标识符成员名;
…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构3例
struct
student{intnum;charname[20];charsex;intage;doublescore;charaddr[30];};namenumsexagescoreaddr4字节4字节20字节1字节8字节30字节……..结构类型定义描述结构的组织形式,不分配内存例子图解4先定义结构类型,再定义结构变量一般形式:struct结构类型名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构类型名变量名表列;结构变量的定义例structstudent{intnum;charname[20];charsex;intage;doublescore;charaddr[30];};structstudentstu1,stu2;5一般形式:struct结构类型名{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;doublescore;charaddr[30];}stu1,stu2;定义结构类型的同时定义结构变量6一般形式:struct{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;doublescore;charaddr[30];}stu1,stu2;用无名结构直接定义变量只能一次直接定义结构变量
7结构类型与结构变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构可嵌套结构成员名与程序中变量名可相同,不会混淆结构类型及变量的作用域与生存期同其它类型变量说明:8形式一:struct结构类型名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构类型名结构变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构变量的初始化9struct结构类型名{
类型标识符成员名;类型标识符成员名;
…………….}结构变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};
结构变量的初始化形式二:10struct{
类型标识符成员名;类型标识符成员名;
…………….}结构变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};
结构变量的初始化形式三:11定义结构类型程序里反复使用的结构最好定义为类型
typedefstruct { doublex,y; }POINT; typedefstruct { POINTcenter; doubleradius; }CIRCLE; typedefstruct { POINTlu; POINTrd; }RECTANGLE;定义结构成员时利用结构标志
structpoint { doublex,y; }; structcircle { structpointcenter; doubleradius; }; structrectangle { structpointlu; structpointrd; };12例定义为结构类型,可以使程序更简短清晰。例:居民身份证信息的结构类型定义:
typedefstruct { charname[20];/*名字字符串用多长?*/ intsex; charnationality[10]; intborn_in[3]; charaddress[50]; intdate_of_issue[3]; intvalid_years; charissued_by[30]; charid_number[18]; charphoto[100][64]; }IDCARD;13无效结构定义结构成员不能是被描述的结构本身。非法结构描述的例子:
structinvalid { intn; structinvalidiv; };14结构的实现结构的实现一个结构占一块连续存储,各成员顺序存放。CIRCLE对象的存储方式。
typedefstruct { POINTcenter;doubleradius; }CIRCLE;15对齐问题结构成员类型可不同,可能出现对齐问题:
structexam { charaa; intnn; doublexx; };为了效率,硬件通常规定各种基本类型数据的摆放方式。例如,通常要求两字节表示的整数从偶数地址的单元开始存放;需要8个字节表示的双精度数,可能要求从8(或4)的倍数地址的单元开始存放系统对整个结构对象的存放也可能有起始位置要求结构体大小,是否等于各个成员大小的和?16结构成员可能不连续,存放位置之间可能出现空位(结构中的空洞)结构大小未必等于成员大小之和。应该用sizeof计算结构大小(例如动态存储分配时)structexam的可能布局:17结构变量的使用设有POINTpt1,pt2;CIRCLEcirc1,circl2;整体赋值同类型结构变量可整体赋值,效果是各成员分别赋值:pt2=pt1;结构不能做相等/不等比较成员访问访问结构成员用圆点运算符(.),具有最高优先级,自左向右结合。例子:pt2.y=pt1.y+2.4;circ1.center.x=2.07;circ1.center.y=pt1.y;18将结构circ2所表示的圆做平移,可以写:circ2.center.x+=2.8;circ2.center.y+=0.24;结构成员相当于相应类型的变量,操作由类型决定。/*简单示例*/intmain(){POINTpt1={2.34,3.28},pt2;CIRCLEcirc1={{3.5,2.07},1.25};doublex,y;pt2.x=8.0;pt2.y=circ1.center.y+3.44;x=pt2.x-pt1.x;y=pt2.y-pt1.y;printf("distance:%f\n",sqrt(x*x+y*y));return0;}19
结构、数组与指针结构可以有数组成员,也可以定义一组以结构为元素的数组(结构数组)例:用结构数组重构C程序关键字统计程序。两种实现:1)两维字符数组和计数器数组;2)用字符指针数组和计数器数组。更合理方式是用一个结构表示与一个关键字有关的所有信息。为此可定义结构类型。
typedefstruct { char*key; intcount; }KEYC;/*“关键字计数器”类型*/20程序数据结构就是一个KEYC数组,定义时初始化:
KEYCkeytable[32]={ "auto",0,"break",0,...... "volatile",0,"while",0 };/*初始化中也可写嵌套的括号*/程序的主循环可写为:
inti;... while(getident(...,s)!=-1) for(i=0;i<32;i++) if(strcmp(s,keytable[i].key)==0){ keytable[i].count++; break; }21也可以用指针方式写:
KEYC*p;... while(getident(...,s)>0) for(p=keytable;p<keytable+32;p++) if(strcmp(s,(*p).key)==0) { (*p).count++; break; }注意(*p).key写法,这里必须写括号。*p.key表示的是*(p.key),会出错。经常需要通过指向结构的指针访问被指结构的成员。C语言为此专门提供运算符->:p->key等价于(*p).key22->具有最高优先级(与圆点,函数调用()及数组元素访问[]一样),从左向右结合。 while(getident(s,...)>0) for(p=keytable;p<keytable+32;p++) if(strcmp(s,p->key)==0) { p->count++;break; }已经讨论了C语言的所有运算符,附录A列出这些运算符:意义/优先级/结合方式。请自己查阅。23结构与函数结构可作为函数参数和函数返回值。将结构数据传给函数有三种方式(返回值情况类似):传结构成员的值,只要该成员能赋值。传递整个结构的值。结构参数。传结构的地址(指针)。结构指针参数。结构参数:实参结构变量的值整个赋给形参,函数内对形参的操作不会影响实参结构指针参数:传结构指针允许函数对实参结构做任何操作,包括修改。可以避免结构复制,若结构很大,复制费时间,也可考虑用指针方式传递24处理结构的函数例:由参数值构造POINT类型的结构值,函数定义:
POINTmkpoint1(doublex,doubley) { POINTtemp; temp.x=x; temp.y=y; returntemp; }返回值可赋给同类型变量。这种函数从成员值构造结构值,可称为结构值构造函数。使用:pt1=mkpoint1(3.825,20.7);pt2=mkpoint1(pt1.x,0.0);temp随函数结束而撤消,值返回,与局部变量的撤消无关。返回大的结构值时需要复制大批数据25例由参数值构造CIRCLE类型的结构值,函数定义:
CIRCLEmkcircle(POINTc,doubler) { CIRCLEtemp; temp.center=c;temp.radius=r; returntemp; }函数有一个结构参数。用例:circ1=mkcircle(pt1,5.254);circ2=mkcircle(circ1.center,11.7);circ3=mkcircle(mkpoint1(2.05,3.7),3.245);第三个例子:mkpoint返回POINT值,传给mkcircle的POINT类型参数26值复制不一定合理定义计算两个点之间距离的函数,采用结构参数:
doubledistance(POINTp1,POINTp2) { doublex=p1.x-p2.x,y=p1.y-p2.y; returnsqrt(x*x+y*y); }复制整个结构,语义清楚。缺点是整体复制开销较大例:打印身份证中身份证号和姓名的函数:
voidprtIDCard0(IDCARDic){ printf("%s\n",ic.id_number); printf("%s\n\n",); }复制整个结构,大部分复制工作没有价值27传递结构指针可考虑传递结构指针,下面函数完成同样工作: voidprtIDCard(IDCARD*icp) { printf("%s\n%s\n\n",icp->id_number,icp->name); }只复制一个指针,更合理。设idc是IDCARD变量:prtIDCard(&idc);例,打印一个身份证结构数组中的各身份证的信息: IDCARDidcs[10000],*p; ... /*假设idcs的元素都有了值*/ for(p=idcs;p<idcs;p++) prtIDCard(p);28动态生成结构,返回指针可采用动态存储管理建立动态分配的结构。下面函数建立POINT结构,返回地址:
POINT*mkpoint2(doublex,doubley) { POINT*p; p=(POINT*)malloc(sizeof(POINT)); p->x=x;p->y=y;returnp; }调用时用指向POINT的指针接收函数返回值。
POINT*q; q=mkpoint2(2.22,1.784);29实例使用实例:
POINT*pp1,*pp2; ...... pp1=mkpoint2(2.57,3.86); pp2=mkpoint2(pp1->y+2.6,pp1->x–0.7); ....../*使用建立的结构*/ free(pp1);free(pp2);/*最后释放存储*/采用动态管理优
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西玉林容县城镇公益性岗位招聘10人笔试备考试题及答案解析
- 2026山东大学校友工作办公室非事业编制人员招聘1人笔试备考题库及答案解析
- 2026四川成都中铁二院内部招聘3人笔试备考试题及答案解析
- 2026年河南检察职业学院单招综合素质笔试备考试题含详细答案解析
- 2026辽宁葫芦岛建昌县消防救援大队招聘政府专职消防员16人笔试备考试题及答案解析
- 2026年安徽国际商务职业学院单招综合素质考试备考题库含详细答案解析
- 2026年辽宁地质工程职业学院高职单招职业适应性测试备考试题及答案详细解析
- 2026贵州航天控制技术有限公司(航天科工十院0612研究所)招聘笔试备考试题及答案解析
- 2026上海市农业科学院工作人员招聘(2026年第一批)笔试备考题库及答案解析
- 2026甘肃省近代物理研究所专项任务办公室招聘3人笔试备考题库及答案解析
- 2026及未来5年中国抽纱刺绣工艺品行业竞争现状及投资前景趋势报告
- 2025动物防疫专员试题及答案
- 单元复习:解码中国-我国区域差异的深度整合与素养提升
- 心肺复苏术护理配合要点
- 中医特色护理在精神科的应用
- 风力发电运输合同范本
- 重难点22 立体几何中的外接球、内切球问题(举一反三专项训练)(全国通.用)(原卷版)-2026年高考数学一轮复习举一反三系列
- 高二生物DNA的复制一节教案(2025-2026学年)
- 法律合规风险评估检查表
- 福建省莆田市擢英中学2026届九年级英语第一学期期末联考试题含解析
- 2024~2025学年北京市大兴区八年级下学期期中考试数学试卷
评论
0/150
提交评论