C语言课件-结构体_第1页
C语言课件-结构体_第2页
C语言课件-结构体_第3页
C语言课件-结构体_第4页
C语言课件-结构体_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

12.1结构体结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体------自定义数据类型结构体类型定义struct [结构体名]{

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

…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体第十二章结构体与共同体12.1结构体struct [结构体名]成员类型可以1例

struct

student{int num;charname[20];charsex;intage;floatscore;charaddr[30];};

namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存例structstudentnamenumsexag2例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1,stu2;

12.2结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名{

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

…………….};struct结构体名

变量名表列;例#defineSTUDENTstructstudent

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

STUDENTstu1,stu2;

例structstudent12.2结构体变3定义结构体类型的同时定义结构体变量一般形式:struct结构体名{

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

…………….}变量名表列;例struct

student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;

定义结构体类型的同时定义结构体变量struct结构4直接定义结构体变量一般形式:struct{

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

…………….}变量名表列;例

struct

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

用无名结构体直接定义变量只能一次直接定义结构体变量struct例struct用无名512.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];

structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;12.3结构体变量的引用结构体嵌套时逐级引用成员(分量)运612.4结构体变量的初始化形式一:struct结构体名{

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

…………….};struct结构体名

结构体变量={初始数据};例

structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};12.4结构体变量的初始化struct结构体名例7形式二:struct结构体名{

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

…………….}结构体变量={初始数据};例

structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式二:struct结构体名例struct8形式三:struct{

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

…………….}结构体变量={初始数据};例

struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式三:struct例struct912.5结构体数组结构体数组的定义三种形式:形式一:

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]25B12.5结构体数组形式一:形式二:形式三:numnam10结构体数组初始化顺序初始化: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++;strcpy(stu[0].name,”ZhaoDa”);结构体数组初始化顺序初始化:分行初始化:全部初始化时维数可省11例统计后选人选票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);}namecountLiZhangWang000例统计后选人选票structpersonnamecou1212.6结构体和指针指向结构体变量的指针定义形式: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;

*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=10112.6结构体和指针使用结构体指针变量引用成员形式存放结构13指向结构体数组的指针例指向结构体数组的指针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]p+1指向结构体数组的指针例指向结构体数组的指针struct14【例】设有下面的定义

structaa{inti;structaa*n;}w,t,*p=&w;要建立如图的结构应如何用指针完成?

p0w

i

n1NULL

t

i

n解:

p->i=0;p->n=&t;p->n->i=1;p->n->n=NULL;

成员n指向了本结构体类型的变量。这种结构就是链表中的节点。用指针处理链表【例】设有下面的定义p0win1tin解:用指针15fchi12.8共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:union共用体名{

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

…………….};类型定义不分配内存例uniondata

{inti;charch;floatf;};fchi12.8共用体union共用体名类型定义不分16形式一:

uniondata{inti;charch;floatf;}a,b;形式二:

uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:

union{inti;charch;floatf;}a,b,c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员有效形式一:形式二:形式三:共用体变量的定义fchifchiab17共用体变量引用引用方式:共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用体变量引用共用体指针名->成员名共用体变量名.成员名(*18例

a.i=1;a.ch=‘a’;printf(“%d”,a.i);(编译通过,运行结果不对)

引用规则不能引用共用体变量,只能引用其成员共用体变量中起作用的成员是最后一次存放的成员例union{inti;charch;floatf;}a;a=1;()

不能在定义共用体变量时初始化例

union{inti;charch;floatf;}a={1,’a’,1.5};()

可以用一个共用体变量为另一个变量赋值例

floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a’;a.f=1.5;b=a;()x=a.f;()例a.i=1;引用规则共用体变量中起作用的成员是最后一19例将一个整数按字节输出0110000101000001低字节高字节0100000101100001ch[0]ch[1]运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain(){unionint_char{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}例将一个整数按字节输出0110000101000001低20结构体与共用体区别:存储方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk变量的各成员同时存在任一时刻只有一个成员存在联系:两者可相互嵌套结构体与共用体structnodeunionno2112.9枚举类型

如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举类型”是指将变量的值一一列举出来。

枚举是用标识符表示的整数常量的集合。1.枚举类型的定义

enum枚举类型名{取值表};如:enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};2.枚举变量的定义──与结构变量类似(1)间接定义:enumweekdaysworkday;(2)直接定义:enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday;

枚举常量是自动设置值的符号常量。除非指定了起始值,否则枚举常量的起始值为0,以后的值依次递增1。12.9枚举类型 如果一个变量只有几种可能的值,可以定义为22找出可能的所有取法的算法

n=0

i从red变到blackj从red变到black

k从red变到black

i!=j真假

k!=i和k!=j真假输出一种取法

n=n+1输出取法的总数n找出可能的所有取法的算法n=0i从red变到blackj23打印出每种排列情况的算法

loop由1到3

loop的值123i=>prij=>prik=>pri

pri的值

red

yellow

blue

white

black打印“red”打印“yellow”打印“blue”打印“white”打印“black”打印出每种排列情况的算法loop由1到3loop的值122412.10用typedef定义类型功能:用自定义名字为已有数据类型命名类型定义简单形式:

typedeftype

name;例

typedefintINTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例

typedeffloatREAL;类型定义后,与已有类型一样使用例

INTEGERa,b,c;REALf1,f2;inta,b,c;floatf1,f2;说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与define不同

define

typedef预编译时处理

编译时处理简单字符置换

为已有类型命名

12.10用typedef定义类型例typedef25typedef定义类型步骤按定义变量方法先写出定义体如

inti;将变量名换成新类型名如

intINTEGER;最前面加typedef如

typedefintINTEGER;用新类型名定义变量如

INTEGERi,j;例定义数组类型

inta[100];intARRAY[100];

typedefintARRAY[100];

ARRAYa,b,c;

inta[100],b[100],c[100];typedef定义类型步骤例定义数组类型int26例定义指针类型

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,*p;structdate{intmonth;intday;intyear;}birthday,*p;例定义指针类型char*p;例定义函数指27作业11.3作业11.32812.1结构体结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体------自定义数据类型结构体类型定义struct [结构体名]{

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

…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体第十二章结构体与共同体12.1结构体struct [结构体名]成员类型可以29例

struct

student{int num;charname[20];charsex;intage;floatscore;charaddr[30];};

namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存例structstudentnamenumsexag30例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1,stu2;

12.2结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名{

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

…………….};struct结构体名

变量名表列;例#defineSTUDENTstructstudent

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

STUDENTstu1,stu2;

例structstudent12.2结构体变31定义结构体类型的同时定义结构体变量一般形式:struct结构体名{

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

…………….}变量名表列;例struct

student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;

定义结构体类型的同时定义结构体变量struct结构32直接定义结构体变量一般形式:struct{

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

…………….}变量名表列;例

struct

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

用无名结构体直接定义变量只能一次直接定义结构体变量struct例struct用无名3312.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];

structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;12.3结构体变量的引用结构体嵌套时逐级引用成员(分量)运3412.4结构体变量的初始化形式一:struct结构体名{

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

…………….};struct结构体名

结构体变量={初始数据};例

structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};12.4结构体变量的初始化struct结构体名例35形式二:struct结构体名{

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

…………….}结构体变量={初始数据};例

structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式二:struct结构体名例struct36形式三:struct{

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

…………….}结构体变量={初始数据};例

struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式三:struct例struct3712.5结构体数组结构体数组的定义三种形式:形式一:

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]25B12.5结构体数组形式一:形式二:形式三:numnam38结构体数组初始化顺序初始化: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++;strcpy(stu[0].name,”ZhaoDa”);结构体数组初始化顺序初始化:分行初始化:全部初始化时维数可省39例统计后选人选票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);}namecountLiZhangWang000例统计后选人选票structpersonnamecou4012.6结构体和指针指向结构体变量的指针定义形式: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;

*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=10112.6结构体和指针使用结构体指针变量引用成员形式存放结构41指向结构体数组的指针例指向结构体数组的指针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]p+1指向结构体数组的指针例指向结构体数组的指针struct42【例】设有下面的定义

structaa{inti;structaa*n;}w,t,*p=&w;要建立如图的结构应如何用指针完成?

p0w

i

n1NULL

t

i

n解:

p->i=0;p->n=&t;p->n->i=1;p->n->n=NULL;

成员n指向了本结构体类型的变量。这种结构就是链表中的节点。用指针处理链表【例】设有下面的定义p0win1tin解:用指针43fchi12.8共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:union共用体名{

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

…………….};类型定义不分配内存例uniondata

{inti;charch;floatf;};fchi12.8共用体union共用体名类型定义不分44形式一:

uniondata{inti;charch;floatf;}a,b;形式二:

uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:

union{inti;charch;floatf;}a,b,c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员有效形式一:形式二:形式三:共用体变量的定义fchifchiab45共用体变量引用引用方式:共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用体变量引用共用体指针名->成员名共用体变量名.成员名(*46例

a.i=1;a.ch=‘a’;printf(“%d”,a.i);(编译通过,运行结果不对)

引用规则不能引用共用体变量,只能引用其成员共用体变量中起作用的成员是最后一次存放的成员例union{inti;charch;floatf;}a;a=1;()

不能在定义共用体变量时初始化例

union{inti;charch;floatf;}a={1,’a’,1.5};()

可以用一个共用体变量为另一个变量赋值例

floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a’;a.f=1.5;b=a;()x=a.f;()例a.i=1;引用规则共用体变量中起作用的成员是最后一47例将一个整数按字节输出0110000101000001低字节高字节0100000101100001ch[0]ch[1]运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain(){unionint_char{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}例将一个整数按字节输出0110000101000001低48结构体与共用体区别:存储方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk变量的各成员同时存在任一时刻只有一个成员存在联系:两者可相互嵌套结构体与共用体structnodeunionno4912

温馨提示

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

评论

0/150

提交评论