《C语言程序设计教程(第4版)》第10章结构体与共用体_第1页
《C语言程序设计教程(第4版)》第10章结构体与共用体_第2页
《C语言程序设计教程(第4版)》第10章结构体与共用体_第3页
《C语言程序设计教程(第4版)》第10章结构体与共用体_第4页
《C语言程序设计教程(第4版)》第10章结构体与共用体_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论