您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 第十四章_结构体 共用体和用户定义的类型
C语言程序设计第14章结构体、共用体和用户定义的类型结构体:是一种自定义的构造数据类型。用途:把不同类型的数据组合成一个整体。struct[结构体名]{类型标识符成员名;类型标识符成员名;…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体14.1结构体类型定义:例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存结构体类型的定义例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu1,stu2;14.1.2结构体变量1、结构体变量的定义(1)、先定义结构体类型,再定义结构体变量一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名变量名表列;(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;用无名结构体直接定义几点说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体成员名与程序中变量名地位相同结构体可嵌套例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear2、结构体变量的初始化和其他类型的变量相同,在定义结构体变量时赋初值形式一:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式二: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”};3结构体变量的引用引用规则结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级: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;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()例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;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..()指针引用结构体变量中数据指针变量名-成员名(*指针变量名).成员名structstudent{charname[12];charsex;structdatebirthday;floatsc[4];}std,arr[5],*ps;ps=&std;引用结构体变量std中的sex成员,可写作:std.sexps-sex(*ps).sex14.1.3结构体数组1、结构体数组的定义和初始化定义:三种形式:形式一:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B初始化:与其他类型的数组赋初值的方法相同例struct{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}};全部初始化时维数可省2、结构体数组引用引用方式:结构体数组名[下标].成员名stu[1].age++;structstudent{intnum;charname[20];charsex;intage;}str[3];strcpy(stu[0].name,”ZhaoDa”);numnamesexagenumnamesexagestu[0]stu[1]25B14.2向函数传递结构体型数据1.向函数传递结构体变量的成员普通变量作函数的实参的用法相同,形参与实参之间仍然是“值传递”的方式。2.向函数传递结构体变量ANSIC允许函数之间传递结构体变量。若实参是结构体变量,那么形参也应是同类型的结构体变量。3.向函数传递结构体数组名若实参是结构体数组名,那么形参也应是同类型的结构体变量。#includestdio.htypedefstuct{intnum;doublemark;}REC;voidsub1(RECx){x.num=23;x.mark=81.5;}voidsub2(RECy[]){y[0].num=12;y[0].mark=77.5;}main(){RECa={16,90.0},b[]=16,90.0};sub1(a);printf(“A)%d,%5.1lf\n”,a.num,a.mark);sub2(b);printf(“B)%d,%5.1lf\n”,b[0].num,b[0].mark);}结果:16,90.012,77.5读入五位用户的姓名和电话号码,按姓名字典顺序排序后,输出用户的姓名和电话号码.#includestdio.h#includestring.h#defineN5typedefstruct{charname[20];charnum[10];}USER;voidgetdata(USER*sp);voidgetsort(USER*sp);voidoutdata(USER*sp);main(){USERsp[N];getdata(sp);getsort(sp);outdata(sp);}voidgetdata(USER*sp){inti;printf(“Entername&phonenumber:\n”);for(i=0;iN;i++){gets(sp[i].name);gets(sp[i].num);}}voidgetsort(USER*sp){inti,j,k;USERtemp;for(i=0;iN-1;i++){k=i;for(j=i+1;jN;j++)if(strcmp(sp[k].name,sp[j].name)0)k=j;temp=sp[k];sp[k]=sp[i];sp[i]=temp;}}voidoutdata(USER*sp){inti;printf(“aftersort:\n”);for(i=0;iN;i++)printf(“%s,%s\n”,sp[i].name,sp[i].num);}§14.3共用体有时需要将几个不同时出现的变量共享一个内存单元.如:将一个整型变量、实型变量、字符型变量共同放入同一个地址空间(当然这几个变量不能同时用),怎么办?C提供了共用体(联合体)类型支持。14.3.1共用体类型union共用体名{类型标识符成员名;类型标识符成员名;…………….};例uniondata{inti;charch;floatf;};类型定义不分配内存fchi100地址开始定义形式:形式二:uniondata{inti;charch;floatf;}a,b;形式一:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;14.3.2共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在1、共用体变量的定义2共用体变量引用引用方式:例a.i=1;a.ch=‘a’;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对)引用规则不能引用共用体变量,只能引用其成员共用体指针名-成员名共用体变量名.成员名(*共用体
本文标题:第十四章_结构体 共用体和用户定义的类型
链接地址:https://www.777doc.com/doc-3157115 .html