用户自己建立数据类型_第1页
用户自己建立数据类型_第2页
用户自己建立数据类型_第3页
用户自己建立数据类型_第4页
用户自己建立数据类型_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

9.1概述定义和使用结构体变量

9.2使用结构体数组

9.3结构体指针

9.4用指针处理链表(自学)9.5共用体类型

9.6使用枚举类型

9.7用typedef定义声明新类型名主要内容第九章用户自己建立数据类型

9.1定义和使用结构体变量基本类型:整型、实型、字符型.......有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如:

一个学生有学号/姓名/性别/年龄/地址等属性intnum;charname[20]; charsex; intage;charaddr[30];把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。数组------由相同类型的数据组成集合结构体-----由不同类型的数据组成集合构造数据类型:

由简单数据类型(intfloatchar)构造而成的(有机整体)数据类型。声明一个结构体类型的一般形式为:struct

结构体名

{

类型标识符成员名1;..................................

类型标识符成员名n;};{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};结构体名结构体structstudent用户自已定义的数据类型结构各成员新定义的类型structstudent和int、float...一样,可用来定义变量。struct

students1,s2;数据类型变量名例1:一组相关变量定义结构体类型例2:一组相关变量定义结构体类型新数据类型结构体成员不同数据类型的成员intmonth;intday;intyear;structdate{

intmonth;intday;intyear;};charname[30];floatsalary;structwage{charname[30];floatsalary;};structdatestructwage说明:1、结构体类型是一种构造数据类型,它与int,char,float等系统定义的基本数据类型具有同等地位,是由用户自行定义的。构造的数据类型可以用来定义变量。2、用户自定义的数据类型时,系统根据类型为其分配存储空间。1、先声明结构体类型再定义结构体变量2、在声明结构体类型的同时定义结构体变量3、直接定义结构体变量3种方法定义结构体类型变量:9.1.2定义结构体类型变量先声明结构体类型再定义结构体变量struct

结构体名

{成员表列};struct

结构体名变量名表列;

structstudent {charname[20];

intage;charaddr[30];};在定义了结构体变量后,系统会为之分配内存单元。例如:在VC中s1和s2在内存中各占54个字节(20+4+30=54)。

structstudent

s1,s2;在声明类型的同时定义结构体变量

struct结构体名{成员表列}变量名表列;

structstudent {charname[20];intage;charaddr[30];}s1,s2;struct

{

成员表列

}变量名表列;struct

{charname[20];

intage;charaddr[30];}s1,s2;直接定义结构体变量即不出现结构体名用无名结构体直接定义变量只能一次结构体类型的几点说明:1、类型与变量是完全不同的概念。先定义结构类型,再定义该类型的变量。

类型:不可赋值、存贮、运算;系统不分配空间。变量:可赋值、存贮、运算;系统要分配空间。2、成员名可以与程序中的变量同名。3、结构体成员也可为结构体。#include<stdio.h>intmain(){

structstd{

charname[20];longintnum;charsex;}s1,s2;

charname[20];………..}structstud{intnum;charname[20];charsex;

intage;

structdate{intmonth;

intday;

intyear;}birthday;charaddr[30];};

structstuds1;可改写为:struct

date{intmonth;

intday;

intyear;};Structstud{intnum;charname[20];charsex;

intage;

struct

date

birthday;charaddr[30];}s1;结构体的嵌套:结构体成员也可为结构体structstudent {charname[20];intage;charaddr[30];};structstudents1,s2;结构体变量名.成员名

s2.age定义结构引用成员

成员运算符结构体变量的引用9.1.3结构体变量的初始化和引用1.结构体变量的初始化可在定义时赋初值,也可动态对成员赋值。#include<stdio.h>structstudent{longintnum;charname[20];charsex;charaddr[20];}a={89031,"LiLin",'M',"123BeijingRoad"};intmain(){printf("No.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,,a.sex,a.addr);return0;}在main()之外例结构体变量初始化(外部存贮类型)填写输出表列#include<stdio.h>intmain(){structstudent{longintnum;charname[20];charsex;charaddr[20];}a={89031,"LiLin",'M',"123Beijingoad"};

printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,,a.sex,a.addr);return0;}在main()之内例结构体变量初始化#include<stdio.h>

intmain(){structdate{intmonth;

intday;intyear;}today;printf(“Entertoday’sdate(mmddyyyy)\n”);scanf(“%d%d%d”,

&today.month,&today.day,

&today.year);printf(“today’sdateis%d/%d/%d\n”,

today.month,today.day,today.year

);return0;}例结构体数据成员输入数据如何输入structdate类型变量today的各个数据成员#include<string.h>structstudent{charnum[10];charname[8];intscore;}stu,change;intmain(){strcpy(

stu.num,”03983101”);

strcpy(

,”zhao”);stu.score=98;

change=stu

;printf(“%-10s%-10s%4d\n”,change.num,,change.score);return0;}结构体变量间的直接赋值运行结果:03983101zhao98例:结构体数据成员赋值遵守以下规则:(1)不能将一个结构体变量作为一个整体进行输入和输出。例如:已定义s1和s2为结构体变量并且它们已有值。printf(″%s,%d,%s,\n″,s1);(2)只可引用最低级成员s1.birthday.days1.birthday.years1.numstruct

date{intmonth;

intday;

intyear;};struct{intnum;charname[20];charsex;

intage;

struct

date

birthday;charaddr[30];}s1,s2;(3)结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。s2.num=s1.num;s1.age++;++s2.age;(4)地址的引用结构体成员的地址引用scanf(“%d”,&s1.num);

结构体变量地址的引用

structstudents1;

structstudent*p;p=&s1;

printf(“%x%x”,&s1,p);9.2使用结构体数组9.2.1定义结构体数组和定义结构体变量的方法相仿,只需说明其为数组即可structstudent{longintnum;charname[20];charsex;

intage;};structstudent

stu[3];stu[3]为结构体数组有三个下标变量stu[0],stu[1],stu[2]每个下标变量均为结构体类型变量包含结构体各成员如何定义数据类型为structstudent,数组名为stu,数组长度为3的数组?数组的各元素内存中连续存放10101“LiLin”‘M’1810102“ZhangFun”‘M’1910103“WangMin”‘F’20stu[2]stu[1]stu[0]stu[0]stu[1]stu[2]numnamesexage10101LiLinM1810102ZhangFunM1910103WangMinF20也可以直接定义一个结构体数组,例如:

structstudent{intnum;…}stu[3];或:

strcut{intnum;…}stu[3];与其他类型的数组一样,对结构体数组可以初始化。

形式:在定义数组后面加上={初值表列}structstudent

{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}

stu[3]={{10101,“LiLin”,’M’,18,87.5,”103BeingRoad”},{...},{....}};

定义结构数组的同时进行初始化根据数组连续存放的原则:由结构体常量的个数来确定数组元素的个数按存储顺序初始化

1、数组元素的个数可以不写。

stu[]={{10101,“Liin”,’M’,18,87.5,”103BeingRoad”},{...},{....}};2、数组元素全部初始化的数组,内层{}也可不写

structperson{charname[20];intcount;}leader[3]={"Li",0,"Zhang",0,"Fun",0};例:

统计投票结果1.先定义由候选人姓名及票数两个成员构成的结构体数组再定义字符串数组变量,放投票结果;2.初始化数组:候选人的姓名、票数(初始值0);3.循环读投票结果给字符串数组元素,是候选人:将其票数+1;否则再循环。4.打印结构数组#include<stdio.h>#include<string.h>structperson{charname[20];

intcount;}

leader[3]={"Li",0,"Zhang",0,"Fun",0};intmain(){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++;}

printf("\n");for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);return0;}9.3结构体指针结构体的指针就是该结构变量在内存中所占的起始地址。结构体类型的指针:可指向结构体变量,也可指向结构体数组中的数组元素。例:指向结构体变量的指针的应用#include<string.h>#include<stdio.h>intmain(){structstudent{longintnum;charname[20];charsex;floatscore;};

structstudentstu_1;

structstudent*p;p=&stu_1;

stu_1.num=89101;strcpy(stu_1.name,"LiLin");stu_1.sex='M';stu_1.score=89.5;

如何定义指针变量p,指向structstudent类型的数据?9.3.1指向结构体变量的指针如何通过指向stu_1的指针变量p,引用其数据成员?printf("\n\nNo.:%ld\nname:%s\nsex:%c\nscore:%f\n",

stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,(*p).name,(*p).sex,(*p).score);printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%f\n",p->num,p->name,p->sex,p->score);return0;}p指向的结构体变量中的成员对结构体变量中成员引用的三种方法:1、结构体变量名.成员名

std.num;2、(*p).成员名

(*p).num3、p->成员名

p->num

.结构成员运算符

->指向运算符优先级:1

结合性:从左至右structstudentstd,*p=&std;structstudent{longintnum;charname[20];charsex;floatscore;};

structstudentstd;

例:有定义:struct{intn; charch;}count,*p;p=&count;得到成员n,用完后n加1得到成员n的值,n先加1后使用p->n(++p)->np->n++++p->n指针p先加1,再访问np所指向结构体变量的成员n的值

用于结构体数组,指向下一个结构体数组元素9.3.2指向结构体数组的指针例:指向结构体数组的指针的应用#include<stdio.h>structstudent{intnum;charname[20];charsex;

intage;};structstudentstu[3]={{10101,"LiLin",'M',18}, {10102,"ZhangFun",'M',19},{10103,"WangMin",'F',20}};

intmain(){

structstudent*p;

printf("NoNamesexage\n");for(

p=stu

;p<stu+3;

p++

)printf("%5d%-10s%2c%4d\n",

p->num,p->name,p->sex,p->age);return0;}p++指向结构体数组下一个数组元素,而不是下一个结构体成员structstudent类型的数组stu[3]的存储示意图:10101“LiLin”‘M’1810102“ZhangFun”‘M’1910103“WangMin”‘F’20stu[2]stu[1]stu[0]pp+1p+2p=stu;p为指向structstudent类型的指针p++将指向结构体数组的下一个数组元素,而不是下一个结构体成员。

p指针只可赋结构体的地址,如果要指向某一成员,则必须进行强制转换。

p=(structstudent*)&stu[1].num;9.3.3用结构体变量和结构体变量的指针作函数参数将结构变量的值传给另一函数:

1、结构成员作参数-------传值

用法和普通变量相同

2、指向结构变量的指针作参数

---传地址

使用结构体变量(或数组)的指针作函数实参,其对应的形参应是相同结构体类型的指针变量。

3、整个结构体变量作参数---传结构实参和形参间采用值复制方式,运行效率低,不提倡。例:有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。要求在main函数中赋予值,在另一函数print中将它们输出。今用指向结构体变量的指针作实参#include<stdio.h>#include<string.h>#define

format"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3];};intmain(){voidprint(structstudent*);

structstudentstu;

stu.num=12345;

strcpy(,"LiLi");stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.6;print(&stu);return0;}定义外部结构体类型同一个文件中的各函数均可用它来定义该结构体变量voidprint(structstudent*p){

printf(format,p->num,p->name,p->score[0],p->score[1],p->score[2]);

printf("\n");}score[0]numnamescore[1]score[2]pP指向stu#include<stdio.h>intmain(){structstudent{intnum;charname[20];floatscore;};

structstudentstu[4];

structstudent*p;

inti,temp=0;floatmax;for(i=0;i<4;i++)

scanf("%d%s%f",

&stu[i].num,stu[i].name,&stu[i].score);for(max=stu[0].score,i=1;i<4;i++)if(stu[i].score>max){max=stu[i].score;

temp=i;}

p=stu+temp;

printf(“\nTheMaxnumscore:\n”;

printf("%d\%s\n%4.1f\n",p->num,p->name,p->score);}程序的功能是什么?9.5共用体类型一、共用体的概念使几个不同的变量共占同一段内存的结构称为“共用体”类型的结构。共用体变量的定义同结构体一样有三种形式:uniondata{charch;floatf;inti;};uniondataa,b,c;uniondata{charch;floatf;inti;}a,b,c;union{charch;floatf;inti;}a,b,c;共用体变量x占用内存示意图:(1)采用内存覆盖技术,使不同数据类型的各个成员变量共用同一存储区。(2)共用体变量所占内存长度为其最长成员的长度fich地址1000结构体与共用体所占内存长度结构体变量:各数据成员所占内存之和共用体:数据成员所占内存长度最大值//TC环境union{charch;floatf;inti;}x;二、共用体变量的引用方式共用体变量的引用方法类似于结构体变量。

共用体变量名.成员变量名例:unionmixed{charch;floatf;

inti;};unionmixedx;不能引用共用体变量,只能引用其成员。

对x变量各成员的引用:

x.c

x.f

x.i三、共用体类型数据的特点1、同一段内存空间可供几种不同类型的成员共享,但在某一时刻只能存放其中的一个成员。2、共用体变量中起作用的成员是最后一次存放的成员,在存入一新成员后原有成员就失去作用。uniondata{ charch;

inti;};voidmain(){ uniondataa;

a.i=256;

printf("\nThevalueofa.iis:%d",a.i);

a.ch='a';

printf("\nThevalueofa.iis:%d",a.i);}例如:共用体变量内存使用说明(TC环境)运行结果:a.i=2560000000000000001a.ch=‘a’01100001000000013、共用体变量的地址和它的各成员的地址相同。4、不能对共用体变量名赋值,也不可能引用变量名来得到成员的值。不能在定义时对它初始化。5、共用体变量不能作为函数的参数,也不能使函数带回共用体变量。6、共用体类型可以出现在结构体类型中,也可以定义共用体数组。9.6枚举类型枚举类型的概念:

枚举是某些常量的集合,枚举变量只可取集合内的值。定义枚举类型和枚举变量:

enumweek{sun,mon,tue,wed,thu,fri,sat};

enumweekday;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论