第二十讲 结构体变量.doc_第1页
第二十讲 结构体变量.doc_第2页
第二十讲 结构体变量.doc_第3页
第二十讲 结构体变量.doc_第4页
第二十讲 结构体变量.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

第二十讲 结构体变量1、结构体与结构体类型的定义信息管理一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。 一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。 如何描述这些类型不同的相关数据?结构体一种构造类型数据 结构体由若干不同类型的数据项组成, 构成结构体的各个数据项称为结构体成员结构体类型定义的一般形式: struct 结构体名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型n 成员名n; ;l struct为关键字;l 结构体名是用户定义的类型标识。l 中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。例如学生类型的定义:struct student char num8; /* 学号是字符数组类型 */ char name30; /* 姓名是字符数组类型 */ char sex; /* 性别是字符型 */ int age; /* 年龄是整型 */ char addr60; /* 住址是字符数组类型 */ int score6; /* 成绩是整型数组类型 */ ;11结构体类型变量的定义 l 利用已定义的结构体类型名定义变量 struct 结构体名 变量名表;例如: struct bookcard book1100; struct student s30, t1, t2;按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。struct date int year,month,day; struct student char num8; char name30; char sex; struct date birthday; /* 成员为结构体类型 */ char addr60; int score6; ;l 对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。l 成员名可与程序中的变量名相同时,也可与不同结构体类型的成员名相同,二者代表不同的对象。l 在定义结构体类型的同时定义变量 struct 结构体名 成员定义表; 变量名表;例如: struct student char num8,name20,sex; int age; float score;st30;l 直接定义结构体类型变量 struct 成员定义表; 变量名表;例如: struct char num8,name20,sex; int age; float score; st30, a, b, c;12结构体变量的初始化 【例】结构体变量的初始化。 struct date int year, month, day; struct student char num8, name20, sex; struct date birthday; float score; a=9606011,Li ming,M,1977,12,9,83, b=9608025,Zhang liming,F,1978,5,10,87,c;说明:如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。如果初值个数多于结构体成员个数,则编译出错。【例】结构体数组的初始化。 struct s char num8,name20,sex; float score; stu3=9606011,Li ming,M,87.5, 9606012,Zhang jiangguo,M,79, 9606013,Wang ping,F,90; 元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数 13结构体变量的运算 l 用sizeof运算符计算结构体变量所占内存空间 struct date int year, month, day;struct student char num8, name20, sex; struct date birthday; float score; a;sizeof(a) 的结果为8+20+1+6+4=39sizeof(struct student) 的结果为39 l 同类型结构体变量之间的赋值运算struct date int year, month, day;struct student char num8, name20, sex; struct date birthday; float score; a=9606011,Li ming,M,1977,12,9,83,b,c;c = a;结构体变量之间进行赋值时,系统将按成员一一对应赋值。l 对结构体变量进行取址运算 struct date int year, month, day;struct student char num8, name20, sex; struct date birthday; float score; a;对结构体变量a进行 &a 运算,可以得到a的首地址,它是结构体类型指针。 14结构体变量成员的引用 结构体变量成员引用的一般形式: 结构体变量名.成员名“.”是分量运算符,运算级别最高。结构体变量的各个成员可进行何种运算,由该成员的数据类型决定 struct date int year, month, day; struct student char num8, name20, sex; struct date birthday; float score; a; 结构体变量a的各成员可分别表示为a.num、、a.sex、a.birthday、a.score 【例】编写一个统计选票的程序。 struct candidate char name20; /* name为候选人姓名 */ int count; /* count为候选人得票数 */ list =invalid,0,Zhao,0,Qian,0, Sun,0,Li,0,Zhou,0;main( ) int i,n; printf(Enter voten); scanf(%d,&n); /* 输入所投候选人编号,编号从1开始 */ while (n!=-1) /* 当输入编号为-1时,表示投票结束 */ if (n=1 & n=5) listn.count+; /* 有效票,则相应候选人计票成员加1 */ else printf(invalidn); list0.count+; /* 无效票,list0的计票成员加1 */ scanf(%d,&n); /* 输入所投候选人编号 */ for (i=1; iyear p-month p-day“-”是指向结构体成员运算符,优先级为一级 【例】输入今天的日期,然后输出该日期。 main( ) struct date /* 在函数中定义结构体类型 */ int year, month, day; today,*p=&today; /* 定义结构体变量及其指针 */ printf (Enter today date(YYYY/MM/DD):); scanf(%d/%d/%d,&today.year,&today.month,&today.day); printf(Today:%d/%d/%dn,p-year,p-month, p-day); 22指向结构体数组的指针 【例】利用结构体指针输出一组化学元素名称及其原子量。 struct list int i; char name4; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218;main( ) struct list *p; printf(NotNametAtomic Weightn); for (p=tab; pi, p-name, p-w); 【例】分析自增自减运算对程序结果的影响。 struct code int i; char c; a =100,A,200,B, 300,C,400,D;main( ) struct code *p=a; printf(%dt,+p-i); printf(%ct,(+p)-c); printf(%dt,(p+)-i); printf(%ct,+p-c); printf(%dt,p-i+); printf(%dn,p-i); 101 B 200 D 300 3013、函数间结构体数据的传递【例】编制一个复数乘法函数,采用值传递的方法传送数据。 struct complex /* 定义存放复数的结构体类型 */ float re; /* re成员用于存放复数的实部 */ float im; /* im成员用于存放复数的虚部 */ ;struct complex multiplier(struct complex cx, struct complex cy) struct complex cz; cz.re=cx.re*cy.re-cx.im*cy.im; cz.im=cx.re*cy.im+cx.im*cy.re; return(cz); 形参是结构体变量。调用此函数时,系统将分别为形参cx和cy各分配一个sizeof(struct complex) 大小的内存空间,每个成员都要一一传递。 main( ) struct complex x, y, z; x.re=3.2; x.im=1.5; y.re=2.7; y.im=4.6; z=multiplier(x, y); printf(%f+%fin,z.re,z.im); /*以复数形式输出*/ 【例】编制一个复数乘法函数,采用传递指针 的方法达到传送数据的目的。 struct complex float re,im; void multiplier(struct complex *px,struct complex *py, struct complex *pz) pz-re=px-re*py-re-px-im*py-im; pz-im=px-re*py-im+px-im*py-re; 形参定义为指针型参数。函数调用时,实参传递的是结构体指针(地址),因此形参px、py可读取主调函数中变量的内容,乘积结果也可通过形

温馨提示

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

评论

0/150

提交评论