版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章结构体与共用体有时,需将不同类型的数据组合成一个有机的整体,以便于引用。这些数据是相互联系的。如一个学生的有关信息:可采用结构体类型的数据描述上述信息。1.例如:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};声明结构体类型时所必须使用的关键字注意不要忽略最后的分号是一个类型名,它和系统提供的标准类型(int,char,float)具有同样的地位和作用2.定义一个结构体类型的一般形式为:struct结构体名{成员表列};structstudent{intnum;charname[20];charsex;intage;charaddr[30];};struct结构体名{类型名成员名;类型名成员名;
…………….
};也称”域表”,每一个成员称为结构体中的一个域3.结构类型可以嵌套定义,即允许一个结构体中的一个或多个成员是其他结构体类型的变量,也可采用先把各成员结构体类型定义后再定义整体结构体.struct结构体名1{类型名成员名;类型名成员名;
struct结构体名1.1{…………….}成员名;
…………….
};struct结构体名1.1{…………….};struct结构体名1{类型名成员名;类型名成员名;
struct结构体名1.1成员名;…………….
};structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;};structstudent{intnum;charname[20];
structdate
{intmonth;intday;intyear;}birthday;};numnamebirthdaymonthdayyear4.结构体类型定义不允许递归,即:一个结构类型的成员不能再用本结构体类型去声明.structA{intn;
structA
m;};5.同一结构内各个成员的名称不能相同.6.可以在结构体的成员中出现当前结构名,以声明一个指向该结构体类型的指针变量.structA{intn;structA*p;};structA{intn;charn;};例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
structstudentstu1,stu2;8.1.2
结构体变量的定义和初始化一、结构体变量的定义1.先声明结构体类型,再定义结构体变量一般形式:struct结构体名{
类型名成员名;类型名成员名;
…………….};struct结构体名变量名表列;例#defineSTUDENTstructstudent
STUDENT{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
STUDENTstu1,stu2;10001ZhangXinM1990.5Shanghaistu1:10002WangLiF2098Beijingstu2:2.定义结构体类型的同时定义结构体变量一般形式:struct结构体名{
类型名成员名;类型名成员名;
…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;3.直接定义结构体变量一般形式:struct{
类型名成员名;类型名成员名;
…………….}变量名表列;struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无结构体名直接定义变量,只能用一次numnamesexagestu32B结构体:structstudent{intnum;charname[20];charsex;intage;};structstudentstu;注意:1.结构体类型与结构体变量概念不同类型:不能赋值、存取、运算;变量:可以类型:不分配内存;变量:分配内存2.对结构体变量中的成员,可以单独使用,它的作用与地位相当于普通变量3.结构体变量成员也可以是一个结构体类型4.成员名可以与程序中的变量名相同,二者不代表同一对象例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];
structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear二、结构体变量的初始化形式一:定义结构体类型后,定义变量同时进行初始化struct结构体名{
类型名成员名;类型名成员名;
…………….};struct结构体名
结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudent
stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};初始化时注意:structSample{inta;intb;floatc;};structSamplest={1};structSamplest={1,2};structSamplest={1,,2.4};形式二:在定义结构体同时定义变量并指定初始值struct结构体名{
类型名成员名;类型名成员名;
…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式三:struct{
类型名成员名;类型名成员名;
…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};三、结构体变量的引用引用规则
1.不能将结构体变量作为一个整体进行输入输出,只能分别输入输出结构体变量中各成员2.若两变量是同一个结构体类型,可以将一个结构体变量整体赋值给另一个结构体变量3.如果结构体变量成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低级地成员进行赋值或存取以及运算。4.可以引用结构体变量成员的地址成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;scanf(“%d”,&stu1.num);printf(“%d,%s,%c,%d,%s\n”,stu1);8.1.3typedef的使用方法功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef原类型名
新类型名;例typedefintINTEGER;类型声明语句关键字已有数据类型名用户定义的类型名例typedeffloatREAL;新类型名声明后,与已有类型名等价例INTEGERa,b,c;REALf1,f2;
inta,b,c;floatf1,f2;通常:用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型名相区别例typedefstruct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}STUDENT;STUDENTstu1,stu2;typedef定义类型步骤按定义变量方法先写出定义体如inti;将变量名换成新类型名如intINTEGER;最前面加typedef如typedefintINTEGER;用新类型名定义变量如INTEGERi,j;例定义数组类型
inta[100];intARRAY[100];typedefintARRAY[100];ARRAYa,b,c;
inta[100],b[100],c[100];例定义指针类型
char*str;char*STRING;typedefchar*STRING;STRINGp,s[10];char*p;
char*s[10];例定义函数指针类型
int(*p)();int(*POWER)();typedefint(*POWER)();POWERp1,p2;int(*p1)(),(*p2)();例定义结构体类型
structdate{intmonth;intday;intyear;}d;例定义结构体类型
structdate{intmonth;intday;intyear;}DATE;例定义结构体类型typedefstructdate{intmonth;intday;intyear;}DATE;例定义结构体类型
DATEbirthday;structdate{intmonth;intday;intyear;}birthday;对typedef的几点使用说明如下:(1)typedef只能对已存在的类型增加一个新的类型名,而没有创造新的类型.(2)从表面上看,typedef与#define的使用方式十分相似,但两者本质上是不同。例如:
#defineCOUNTinttypedefintCOUNT;#define定义的是一个宏,宏名为COUNT,在预编译时,编译器将进行宏替换,把字符串COUNT替换为字符串int。typedef定义的是一种新的数据类型名,类型名为COUNT,它是系统标准类型(int)的别名,在编译时,编译器会将COUNT与int作为同一个类型来处理。(3)使用typedef有利于程序的通用与移植.
8.1.4
结构体数组1.结构体数组的定义三种形式:形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]32B形式一:
structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];2.结构体数组初始化例structstudent{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};顺序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化时元素大小可省结构体数组引用引用方式:结构体数组名[下标].成员名structstudent{intnum;charname[20];charsex;intage;}stu[3];stu[1].age;对结构体数组元素引用:可以把一个数组元素整体赋值予另一个数组元素stu[0]=stu[1];可以单独的把一个结构体数组元素中的一个成员的值赋予同一数组另一个元素的成员
stu[0].age=stu[1].age;
例8-2输入某班26位学生的姓名及数学、英语成绩,计算并输出每位学生的平均分structstudent{charname[10];intmath,english;floataver;};voidmain(){structstudents[26];inti;
for(i=0;i<26;i++){scanf("%s%d%d",s[i].name,&s[i].math,&s[i].english);s[i].aver=(s[i].math+s[i].english)/2.0;printf(“%s%f\n",s[i].name,s[i].aver);}}例8-3有10人参与投票,统计候选人票数。structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang0008.1.5
指向结构体的指针指向结构体变量的指针定义形式:struct结构体名*指针变量名;例structstudent*p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*结构体指针名).成员名结构体指针名→成员名结构体变量名.成员名指向成员运算符优先级:1结合方向:从左向右例指向结构体的指针变量main(){structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");
p->sex='M';p->score=89.5;printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
(*p).num,p->name,stu_1.sex,p->score);}例intn;int*p=&n;
n=10;
*p=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101【例8-4】通过指向结构的指针输出结构中的成员#include<stdio.h>#include<string.h>structA{inta;charb[10];doublec;};voidf(structA*t);main(){structAa={1001,"ZhangDa",1098.0};f(&a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}voidf(structA*t){strcpy(t->b,"ChangRong");}指向结构体数组的指针例指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]pp用结构体变量的成员作函数参数----值传递用指向结构体变量的指针作参数----地址传递用结构体变量作参数----多值传递,效率低structdata{inta,b,c;};main(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:18b:5c:90(main)arga:27b:3c:30(main)例用结构体指针变量作函数参数arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****8.2
共用体用途:使几个不同类型的成员数据项共占一段内存(相互覆盖)1.共用体类型定义union共用体名{
类型名成员名1;类型名成员名2;
…………….};例uniondata{inti;
charch;
float
f;};类型定义不分配内存一般定义形式:形式二:
uniondata
{inti;charch;floatf;}a,b;形式一:
uniondata
{inti;charch;floatf;};
uniondataa,b,c,*p,d[3];形式三:
union
{inti;charch;floatf;}a,b,c;2.共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在共用体变量引用引用方式:共用体类型数据的特点:共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时存在和起作用,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。如有以下赋值语句:a.i=1;a.c=‘a’;a.f=1,5;在完成以上3个赋值运算以后,只有a.f是有效地,a.i和a.c已经无意义了。此时用printf(“%d”,a.i)是不行的,而printf(“%d”,a.f)是可以的,因此在引用共用体变量时应十分注意当前存放在共用体变量中的哪个成员。共用体变量引用引用方式:共用体类型数据的特点:共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名(2)共用体变量的地址和它的各成员的地址都是同一地址。例如:&a、&a.i、&a.c、&a.f都是同一地址值。(3)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。例如,下面这些都是不对的:Union{inti;charch;floatf;}a={1,’a’,1.5}//不能初始化a=1;//不能对共用体变量赋值m=a;//不能引用共用体变量名以得到一个值例设有如下的说明和定义:答案:30typedefunion{long
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年乌审旗苏里格现代煤化工产业研究院招聘备考题库及一套答案详解
- 天津2025年民生银行天津分行社会招聘备考题库完整答案详解
- 2026年户外运动租赁合同
- 2026年医院LIS系统接口开发合同
- 2026年医院信息管理系统升级合同
- 2026年摄影作品使用合同
- 2026年合规管理体系认证代理合同
- 资源买断合同(标准版)
- 银联企业服务(上海)有限公司2026年度招聘备考题库参考答案详解
- 长沙市望城区人民医院2025年面向社会公开招聘编外合同制专业技术人员备考题库带答案详解
- 2025四川航天川南火工技术有限公司招聘考试题库及答案1套
- 广东广电网络2026届秋季校园招聘185人备考题库完整答案详解
- 2025年度皮肤科工作总结及2026年工作计划
- (一诊)成都市2023级高三高中毕业班第一次诊断性检测物理试卷(含官方答案)
- 四川省2025年高职单招职业技能综合测试(中职类)汽车类试卷(含答案解析)
- 2025年青岛市公安局警务辅助人员招录笔试考试试题(含答案)
- 2024江苏无锡江阴高新区招聘社区专职网格员9人备考题库附答案解析
- 科技园区入驻合作协议
- 电大专科《个人与团队管理》期末答案排序版
- 山东科技大学《基础化学(实验)》2025-2026学年第一学期期末试卷
- 2025西部机场集团航空物流有限公司招聘笔试考试备考试题及答案解析
评论
0/150
提交评论