高级语言程序设计 课件 第8章 结构体类型和自定义类型_第1页
高级语言程序设计 课件 第8章 结构体类型和自定义类型_第2页
高级语言程序设计 课件 第8章 结构体类型和自定义类型_第3页
高级语言程序设计 课件 第8章 结构体类型和自定义类型_第4页
高级语言程序设计 课件 第8章 结构体类型和自定义类型_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第8章结构体类型和自定义类型8.1结构体类型定义

结构体类型变量8.2

结构体类型数组8.38.4结构体类型指针8.5自定义类型本章内容导读本章主要介绍结构体类型的定义、初始化和引用,结构体类型数组的定义、初始化和引用,以及结构体类型指针的使用和自定义类型及其使用。通过学习本章,读者应掌握以下内容:了解结构体类型数据的特点;掌握结构体类型定义方法,结构体类型变量、数组和指针变量的定义、初始化和结构体类型数据成员的引用方法;掌握用户自定义数据类型的定义方法和应用。C语言中的结构体类型,相当于其它高级语言中的“记录”类型。不同于基本数据类型,结构体类型是用户自定义的一种数据类型,由若干个数据项组合而成,这些数据项称为结构体类型的成员(又称为“域”或“结构分量”),每个成员可以是一个基本数据类型,也可以是一个构造数据类型。结构体类型必须先定义,然后才能使用已定义的结构体类型定义相应的变量、数组和指针等。定义格式struct

结构体类型名/*struct是结构类型关键字*/{数据类型符成员名1;

数据类型符成员名2;

…………

数据类型符成员名n;

};

/*此行分号不能少!*/

8.1结构体类型定义【例8-1】定义一个反映学生基本情况的结构体类型,用以存储学生的相关信息。structdate /*日期结构类型:由年、月、日三项组成*/{intyear;

intmonth;

intday;};struct

std_info/*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/{charno[7];charname[9];charsex[3];

structdatebirthday;};structscore /*成绩结构类型:由学号和三门成绩共4项组成*/{charno[7];

intscore1;

intscore2;

intscore3;};说明(1)“结构体类型名”和“成员名”的命名规则,与变量名相同。(2)数据类型相同的成员,既可逐个、逐行分别定义,也可合并在一行定义。例如【例8-1】代码中的日期结构体类型,也可改为如下形式:

structdate{intyear,month,day;};(3)结构体类型中的成员,既可以是基本数据类型,也允许是另一个已经定义的结构体类型。例如【例8-1】代码中的结构体类型std_info,其数据项“birthday”就是一个已经定义的日期结构体类型date。(4)一个数据项称为结构类型的一个成员(或分量)。8.1结构体类型定义用户自己定义的结构体类型,与系统定义的标准类型(int、char等)一样,可用来定义结构体变量的类型。间接定义法──先定义结构体类型、再定义结构体类型的变量例如利用【例8-1】中定义的学生信息结构类型std_info,定义了一个相应的结构变量student:

struct

std_infostudent;结构体类型变量student:拥有结构体类型的全部成员,其中成员birthday是一个日期结构体类型,它又由3个成员构成。注意:使用间接定义法定义结构体类型变量时,必须同时指定结构体类型名。1、结构体类型变量的定义8.2结构体类型变量

直接定义法──在定义结构体类型的同时,定义结构体类型变量例如,结构体类型变量student的定义可改为:struct

std_info{

……}student;说明(1)结构体类型与结构体类型变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。(2)结构体类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。1、结构体类型变量的定义8.2结构体类型变量

无名定义法──省略结构体类型、直接定义结构体类型变量将结构体类型和结构体类型变量同时进行定义,但省略了结构体类型名,以后将无法再使用这种结构体类型定义其他变量。例如struct{…}a,b;第二种和第三种定义结构体类型变量的一般格式如下:

struct[结构体类型名]

{……

}结构体类型变量表;注意:结构体类型定义的是一个数据结构的模板,其中并无具体数据,系统不会为其分配实际的内存空间,定义了结构体类型变量后,编译系统才为结构体类型变量分配存储空间,顺序存放各个成员。1、结构体类型变量的定义8.2结构体类型变量

【例8-2】计算结构体类型(或结构体变量)的字节数。#include<stdio.h>#defineNAMESIZE20#defineADDRSIZE100structbirthday{intyear;

intmonth;

intday;};structperson{charname[NAMESIZE];

structbirthdaydate;charsex;charaddress[ADDRSIZE];longzipcode;};intmain(void){structpersonp;

printf("theplength:%d\n",sizeof(p));

printf("thestructpersonlength:%d\n",sizeof(structperson));return0;}结构体变量的存储结构:

对结构体变量成员顺序分配存储空间。Theplength:131Thestructpersonlength:131间接初始化直接初始化无名初始化

注意:初值的数据类型,应与结构变量中相应成员所要求的一致,否则会出错。

2、结构体类型变量的初始化8.2结构体类型变量

【例8-3】结构体变量的初始化。#include<stdio.h>#defineNAMESIZE20#defineADDRSIZE100structbirthday{intyear;

intmonth;

intday;};structperson{charname[NAMESIZE];

structbirthdaydate;charsex;charaddress[ADDRSIZE];longzipcode;};structpersonp={"LiPing",{1994,12,25},'m',"zhong

shanroad",310000};intmain(void){printf("Name:%s\n",);

printf("birthday:%d,%d,%d\n",p.date.year,p.date.month,p.date.day);

printf("sex:%c\n",p.sex);

printf("address:%s\n",p.address);

printf("zipcode:%ld\n",p.zipcode);return0;}name:LiPingbirthday:1994,12,25sex:maddress:zhongshanroadzipcode:310000(1)对于结构体类型变量,通过成员运算符“.”,逐个访问其成员,其一般形式是:结构体类型变量名.成员名/*其中的“.”是成员运算符*/(2)如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用,其引用格式扩展为:

结构变量.成员.子成员.….最低1级子成员例如,引用结构变量student中的birthday成员的格式分别为:

student.birthday.year

student.birthday.month

student.birthday.day而student.birthday

相当于引用一个结构体类型变量,一般不能直接引用。对于最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。3、结构体类型变量成员的引用8.2结构体类型变量

引用方法&结构体类型变量名.成员名

/*成员是变量形式的变量地址*/结构体类型变量名.成员名

/*成员是数组形式的数组首地址*/&结构体类型变量名.成员数组[下标]

/*成员是数组,其数组元素的地址*/注意:存放结构体类型变量成员地址的指针变量的数据类型必须与该成员的数据类型相同。引用方法&结构体类型变量名注意:存放结构体类型变量地址的指针变量必须是相同类型的结构体类型指针变量。4、结构体类型变量成员地址的引用8.2结构体类型变量

5、结构体类型变量地址的引用

定义格式

struct

结构体类型名

{成员列表;}

struct

结构体类型名结构体类型数组名[数组长度];structstudentaatd[10]={{"zhangming",18,'m'},{"Lipiang",20,'f'}};

structstudentaatd[]={{"zhangming",18,'m'},{"Lipiang",20,'f'}};

初始化格式struct

结构体类型数组名[数组长度]={{初值表1},{初值表2},…,{初值表n}};8.3结构体类型数组

结构体类型数组元素成员的引用结构体类型数组名[下标].成员名注意:与结构体类型变量相同,一般不能直接使用结构体类型数组元素,只能使用其成员。结构体类型数组元素成员地址的引用&结构体类型数组名[下标].成员名注意:存放结构体类型数组元素成员地址的指针变量的数据类型必须与结构体类型中该成员的数据类型相同。8.3结构体类型数组结构体变量在内存中的起始地址称为结构体变量的指针。【例8-4】使用指向结构变量的指针来访问结构变量的各个成员。

#include<stdio.h>

struct

std_infostudent={"000102","张三","男",{1980,9,20}};

intmain(void){

struct

std_info*p_std=&student;

printf("No:%s\n",p_std->no);

printf("Name:%s\n",p_std->name);

printf("Sex:%s\n",p_std->sex);

printf("Birthday:%d-%d-%d\n",p_std->birthday.year,

p_std->birthday.month,p_std->birthday.day);} 8.4结构体类型指针通过指向结构体类型变量的指针访问结构体类型变量的成员,与直接使用结构体类型变量的效果一样。通常,如果指针变量pointer已指向结构体类型变量var,则以下三种形式等价:var.成员pointer->成员(*pointer).成员/*“*pointer”外面的括号不能省!*/注意:在第一种格式中,分量运算符左侧的运算对象只能是结构体类型变量;而在第二种格式中,指向运算符左侧的运算对象,只能是指向结构体类型变量(或结构体类型数组)的指针变量,否则都出错。1、指向结构体类型变量的指针变量8.4结构体类型指针指针变量指向结构体类型数组元素

方式一:(*指针变量).成员名

方式二:指针变量->成员名注意:这里的指针变量必须已经指向某一结构体类型数组元素。指针变量指向结构体类型数组

方式一:(*(指针变量+i)).成员名方式二:(指针变量+i)->成员名注意:这里的指针变量必须已经指向某一结构体类型数组,则上述两种引用方式均等价于“数组名[i].成员名”。2、指向结构体类型数组的指针变量8.4结构体类型指针利用全局变量传递结构体类型数据利用返回值传递结构体类型数据利用返回值传递结构体类型数据时,只能返回一个结构体类型数据。利用形参和实参结合传递结构体类型数据分为地址传递和值传递两种方式。(1)地址传递方式地址传递方式中,形参可以是结构体类型数组或指针变量,对应的实参必须是同一结构体类型的变量地址、数组名、数组元素地址或已赋值的结构体类型的指针变量。在调用函数时,由于传递的是一个地址,而不是整个结构体类型变量,因此这种传递方式效率较高。(2)值传递方式值传递方式中,形参为结构体类型变量,对应的实参必须是同一结构体类型的变量或数组元素。3、指向结构体类型数据在函数间的传递8.4结构体类型指针【例8-5】向函数传递结构体变量。#include<stdio.h>struct

data{

int

a,b,b;};func(parm)structdataparm;{

printf("parm.a=%dparm.b=%d

parm.c=%d\n",parm.a,parm.b,parm.c);

printf("PROCESS...\n");

parm.a=18;

parm.b=5;

parm.c=parm.a+parm.b;

printf("parm.a=%dparm.b=%d

parm.c=%d\n",parm.a,parm.b,parm.c);

printf("RETURN...\n");}int

main(void){structdataarg;

arg.a=27;

arg.b=3;

arg.c=arg.a+arg.b;

printf("arg.a=%darg.b=%d

arg.c=%d\n",arg.a,arg.b,arg.c);

printf("CALLFUNC()...\n");

func(arg);

printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);return0;}arg.a=27arg.b=3arg.c=30CALLFUNC()…parm.a=27parm.b=3parm.c=30PROCESS…parm.a=18parm.b=5parm.c=23RETURN…arg.a=27arg.

温馨提示

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

评论

0/150

提交评论