第11章结构体与共用体.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第11章结构体、共用体及枚举类型概述结构体类型变量的定义结构体类型变量的引用结构体类型变量的初始化结构体与数组结构体与指针共用体枚举类型使用typedef定义数据类型2C语言的数据类型基本类型整型、实型(单精度、双精度)、字符型、枚举类型构造类型数组类型、结构体类型、共用体类型指针类型空类型3数组:由相同类型的数据(数组元素)构成。结构体:由不同类型数据(成员变量)构成,各自占有独立的内存空间。共用体:由不同类型数据(成员变量)构成,共用一组内存空间。构造类型数据4结构体类型举例:学生情况记录一名学生有一组相关的变量(属性)与之对应,比如学号、姓名、性别、年龄、成绩、地址等。structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};511.2结构体类型变量的定义定义结构体类型变量的方法有三种:先声明一个结构体类型,再定义相应的变量。声明结构体类型的同时,定义该结构体类型的变量。不声明结构体类型,直接定义结构体变量。6一般形式:struct结构体类型名{成员列表};structpoint{intx;inty;};structpointp1,p2;方法一先声明结构体类型再定义变量名struct结构体类型名变量名表;7一般形式:struct结构体类型名{成员列表}变量名表;structpoint{intx;inty;}p1,p2;方法二声明结构体类型的同时定义变量8一般形式:struct{成员列表}变量名表;struct{intx;inty;}p1,p2;方法三直接定义结构体类型变量9结构体类型不分配存储单元,用结构体类型定义的变量会分配存储空间;对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量;一个结构体的成员名字不能相同,但两个结构体中可以使用同名成员,成员名也可以与程序中的变量名相同,二者代表不同的对象;成员也可以是一个结构体变量(嵌套)。说明1011.3结构体变量的引用C语言中,任何变量的使用都必须“先定义、后引用”结构体类型是具有复合结构的构造类型,其变量引用方式可有两种:逐个引用结构体变量中的成员整体引用结构体111、引用结构体变量中的成员一般形式:结构体变量名.成员名说明:“.”是结构体成员操作符,优先级很高。该运算符的结果为对应的成员变量。142、整体引用结构体结构体的整体引用仅限于:对结构体变量整体赋初值作为函数参数传递取地址注意:决不能对结构体变量进行整体加、减、比较等运算!即使结构体中只有一个成员。15结构体变量引用注意事项:(1)不能将一个结构体变量作为一个整体进行输入和输出。struct{longnum;charname[20];}stud;scanf(%d,&stud);printf(%d“,stud);scanf(%ld%s,&stud.num,stud.name);printf(%ld,%s,stud.num,stud.name);(2)结构体中的每一个成员变量都可以看成是一个简单变量,可以进行运算。(3)如果结构体类型中的某个成员又是结构体类型,那么引用成员中的成员,应该按照一级一级的方式找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。stud2.score=stud1.score;sum=stud1.score+stud2.score;stud1.age++;stud1.birthday.month(4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。scanf(“%d”,&stud1.num);printf(“%d”,&stud1);scanf(“%d,%s,%c,%d,%f”,&stud1);1811.4结构体变量的初始化一般形式:结构体类型名结构体变量名=结构体初值;说明:结构体初值是用一对花括号括起来的数据序列,序列中的数据与结构体类型中的成员变量一一对应。structstructtype{inta,b;floatf1;}str1={1,2,3.4};main(){structstructtypestr2={3,4,9.6};staticstructstructtypestr3={7,2,10.2};printf(str1:%d,%d,%f\n,str1.a,str1.b,str1.f1);printf(str2:%d,%d,%f\n,str2.a,str2.b,str2.f1);}str1:1,2,3.4str2:3,4,9.620初始化时还要注意:被初始化的变量必须是刚定义的变量。结构体的初始化可以只进行一部分。如果结构体类型中又包含有结构体类型的成员,可依次在结构体初始值中列出其初始值,也可用花括号将表示成员结构体的部分括起来。2111.5结构体数组结构体变量:存放一组不同类型的数据例如学生信息(学号、姓名、性别、成绩、…)结构体数组:对数据的横向划分:引进结构体对数据的纵向划分:引进数组结构体数据由两种构造类型数据(数组、结构体)组成。221、结构体数组的定义形式方式一struct类型名{成员表};struct类型名数组名[常量表达式];structstudent{intnum;charname[20];charsex;intage;floatscore[4];};structstudentstudents[10];先声明结构体类型,再定义结构体数组23struct类型名{成员表}数组名[常量表达式];structstudent{intnum;charname[20];charsex;intage;floatscore[4];}students[10];结构体数组的定义形式方式二在声明结构体类型的同时定义结构体数组24struct{成员表}数组名[常量表达式];struct{intnum;charname[20];charsex;intage;floatscore[4];}students[10];结构体数组的定义形式方式三直接定义结构体数组25结构体数组在内存中的存放:numnamesexagestudents[0]20215LiPingM18students[1]20216ZhangSanM17students[2]20217WangWuF19•按数组下标由小到大•在给每个数组元素的空间内再按照成员的顺序连续存放。20215LiPingM1820216ZhangSanM1720217WangWuF19262、结构体数组的引用stud[2].numstud[1].sexstud[2].score[1]引用形式:stud[i].num成员名序号数组名27说明不能将结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员为对象进行输入输出。scanf(%s,stud[1].name);printf(%ld,%s,%d,%f,stud[1].num,stud[1].name,stud[1].age,stud[1].score);283、结构体数组的初始化定义结构体数组的同时对它们进行初始化一般形式:struct类型名数组名[常量表达式]={{…},…,{…}};structstudent{intnum;charname[20];charsex;intage;floatscore;}stu[3]={{10101,”LiLin”,’M’,18,87.5},{10102,”ZhangFang”,’F’,19,99},{10103,”WangMin”,’M’,20,78.5}};29说明“数组名”后面的“常量表达式”可以省略,由系统根据初始化数据个数决定数组长度。可以只对部分数据初始化。允许在初始化时省略标识单个结构体的花括号。例:structaa{inta;intb;};structaabb[5]={1,2,{3,4},5,6,7,8};main(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(“%s”,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}【例11-1】对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#includestring.hstructperson{charname[20];intcount;}leader[3]={“Li”,0,”Zhang”,0,”Fun”,0};printf(\n);for(i=0;i3;i++)printf(%5s:%d\n,leader[i].name,leader[i].count);}31指向结构体变量的指针指向结构体数组的指针函数参数为结构体类型数据11.6结构体与指针32结构体变量的指针:结构体变量的起始地址。定义形式:struct结构类型名*变量名;1.指向结构体变量的指针structstudent*p,stud;p=&stud;33用结构体变量指针间接访问结构体成员指针变量名-成员名p-age=18(*指针变量名).成员名(*p).age=18*p两侧的括号不能省略。p已定义为指向一个结构体类型的指针变量,它只能指向结构体变量而不能指向它其中的一个成员。如p=&stud1.age是错误的。“-”运算符优先级别最高。p-age+1++p-age()()34【例11-2】在三个学生中查找出成绩最好的学生并显示该学生的情况。structstudent{charname[20];charsex[3];intage;intscore;charaddr[30];};structstudentstud1={Zhangliping,M,23,79,shanghai};structstudentstud2={Qianlong,F,24,85,nanjing};structstudentstud3={Liujun,F,22,66,shanghai};main(){inti;structstudent*p=&stud1;if(p-scorestud2.score)p=&stud2;if(p-scorestud3.score)p=&stud3;printf(%s%s%d%d%s\n,p-name,p-sex,p-age,p-score,p-addr);}36说明引用结构体成员有三种方式:结构体变量.成员名(*p).成员名P—成员名p-np-n++++p-n37一个指针变量指向一个结构体数组,也就是将该数组的起始地址赋给此指针变量。定义一个结构体类型定义属于这种结构体类型的数组和指向这种结构体类型的指针变量把数组的首地址赋给指针变量2.指向结构体数组的指针38#defineN3#include“string.h”struct{charname[20];charsex;intage;intscore;charaddr[30];}stud[N]={{“Liping”,“M”,23,79,“Shanghai”},{“Qianlong”,“F”,24,85,“nanjing”},{“Liujun”,“F”,22,66,“Shanghai”}},*p=stud;【例11-3】在N名毕业生中查找上海籍的学生。main(){inti;for(i=0;iN;i++,p++)if(strcmp((*p).addr,“Shanghai)==0)printf(%s%c%d%d%s\n“,(*p).name,(*p).sex,(*p).age,(*p).score,(*p).addr);}LipingM2379ShanghaiQianlongF2485NanjingLiujunF2266Shanghaipstud[0]stud[1]stu

1 / 63
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功