您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第11章结构体和共用体--C语言程序设计(谭浩强第三版)讲解
结构体类型和结构体变量结构体数组结构体指针用指针处理链表共用体枚举类型用typedef定义类型第11章结构体与共用体问题一:学籍管理•问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用C语言程序存储并处理一组学生的学籍。单个学生学籍的数据结构•学号(num):int型•姓名(name):char[]型•性别(sex):char型•年龄(age):int型•分数(score):float型单个学生学籍的数据结构如何定义?多个学生学籍的数据结构如何定义?这些信息数据之间相互关联,适合看作一个整体。但数据类型不一致,仅用已学数据类型无法解决。需要构造一种新的数据类型————结构体。11.1-11.4结构体类型和结构体变量结构体——是用户根据自己的需要一种构造类型数据。结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。struct[结构体名]{数据类型1成员名1;数据类型2成员名2;……数据类型n成员名n;};{}中是组成该结构体的成员。成员类型可以是基本型或构造型struct是关键字,不能省略用户定义的合法标识符。可省:无名结构体末尾分号不能省结构体类型声明----------构造自己所需的结构体类型1、结构体类型声明namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};结构体名成员名例声明结构体类型structstudent注意:结构体类型声明只是定义了一种新的类型,类似int等类型。它是对结构的组织形式的描述,(类似于房屋户型图),系统还没分配实际内存空间。结构的组织形式描述只有定义结构体类型的变量,系统才分配内存空间一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名变量名表列;(1)先定义(声明)结构体类型再定义变量名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};//结构体类型的声明structstudentstudent1,student2;//结构体变量的定义2、结构体变量定义有了类型后,就可以定义变量。三种形式:(2)定义结构体类型的同时定义结构体变量一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;(3)直接定义结构体变量(即不出现结构体名)一般形式:struct{类型标识符成员名;类型标识符成员名;…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;用无名结构体直接定义变量只能一次3、结构体变量需要的内存等于结构体变量所有成员占内存之和22012430Numnamesexagescoreaddrstudent1student1在内存中占59个字节,(2+20+1+2+4+30=59)。•利用表达式sizeof(student1)或sizeof(structstudent)或可自动求得注意:结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以4、结构体变量初始化就是为成员赋初值。根据前面结构体变量定义形式的三种情况,初始化的形式也有三种。struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstudent1={100102,“WangLin”,‘M’,20,“Beijing”};形式一:Student1(初始化后)100102WangLiM2098Beijing22012430NumnamesexagescoreaddrStudent1(初始化前)此时,才真正货真价实。定义类型不分配空间。定义变量时分配空间,但值不确定,初始化后值确定。形式二:struct结构体名{类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};5、结构体变量初始化形式三:例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};struct{类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};5、结构体变量初始化6、结构体变量使用(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++;.成员(分量)运算符优先级:1最高级结合性:从左向右结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。成员名可以与程序中的变量名相同,二者不代表同一对象。例:不能将一个结构体变量作为一个整体进行输入和输出。只能对各个成员变量分别输入输出。structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()printf(“%d,%s,%c,%d,%f,%s\n”,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.addr);(√)scanf(″%d,%s,%c,%d,%f,%s″,&student1);()scanf(″%d″,&student1.num);(√)(2)例外:允许将一个结构体变量直接赋值给另一个具有相同结构的结构体变量例如:structstudent{charnum[15];charname[20];intscore[4];ints;}student1={2007101010,wang,{89,90,87,80},0};main(){structstudentstudent2;student2=student1;…….}例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}student1;numnamebirthdaymonthdayyear结构体成员本身又是一个结构体类型。例:声明structstudent类型时,将成员birthday指定为structdate类型7、结构体类型的嵌套结构体嵌套时逐级引用(只能对最低级的成员进行赋值或存取以及运算)student1.birthday.month=3(√)student1.birthday=3()11.5、结构体数组1、定义结构体数组:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。也有三种方法:1、定义结构体后定义structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu[3];2、定义结构体时同时定义structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu[3];一般初始化省略维数[]定义后初始化一般初始化structstudent{intnum;charname[20];charsex;intage;floatscore;}stu[3]={{10101,李宁,'M',18,87.5},{10102,张凡,'M',19,99},{10103,王敏,'F',20,78.5}};定义后初始化structstudent{intnum;charname[20];charsex;intage;floatscore;};structstudentstu[3]={{10101,李宁,'M',18,87.5},{10102,张凡,'M',19,99},{10103,王敏,'F',20,78.5}};每个数组元素的初始数据都用花括号括起来。2、结构体数组的初始化结构数组[n]={{初值表1},{初值表2},...,{初值表n}};•图11-4•图11-5结构体数组元素类似于一个结构体变量•只能对结构体数组元素的成员进行输入、输出或其它基本操作例如:structs_type{charnum[15];charname[20];intscore[4];ints;}stu[3]={{2007101010,wang,{89,90,87,80},0},{2007101011,Li,{88,95,77,70},0},{2007101012,Jiang,{79,65,69,76},0}};main(){inti;for(i=0;i3;i++)for(j=0;j4;j++)stu[i].s+=stu[i].score[j];….}3、结构体数组元素的使用例11.2统计侯选人选票。有三个候选人,每次输入一个得票的候选人名,要求最后输出个人得票结果。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;j3;j++)if(strcmp(leader_name,leader[j].name)==0)//看是谁得票leader[j].count++;}for(i=0;i3;i++)printf(%5s:%d\n,leader[i].name,leader[i].count);}namecountLiZhangWang000运行结果:Li↙Fun↙Zhang↙Zhang↙↙Li↙Fun↙Zhang↙Li↙Li:4Zhang:3Fun:3程序定义一个全局的结构体数组leader,它有3个元素,每一个元素包含两个成员name(姓名)和count(票数)。在定义数组时使之初始化,使3位候选人的票数都先置零。在主函数中定义字符数组leader-name,它代表被选人的姓名,在10次循环中每次先输入一个被选人的具体人名,然后把它与3个候选人姓名相比,看它和哪一个候选人的名字相同。在输入和统计结束之后,将3人的名字和得票数输出。namecountLiZhangWang00011.6用指针访问结构体1、指向结构体变量的指针可以设一个
本文标题:第11章结构体和共用体--C语言程序设计(谭浩强第三版)讲解
链接地址:https://www.777doc.com/doc-3148934 .html