版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章目录9.1用typedef定义新类型9.2结构体类型9.3共用体类型9.1用typedef定义新类型
C语言允许由用户自己定义类型说明符,即允许由用户为数据类型取“别名”。新类型定义符typedef可用来完成此功能,其语句一般形式为:typedef原类型名新类型名;
其中,“原类型名”是已有的类型标识符,“新类型名”是一个用户定义标示符,可以代替“原类型名”,原类型名依然有效。9.1用typedef定义新类型例如:typedefintINTEGER;
该语句用新类型名INTEGER来代替已有的int类型名。在此定义后,可以用INTEGER来定义整型变量。例如:
INTEGERa,b;
等效于inta,b;
用typedef定义数组、指针、结构等类型将带来很大的方便,使程序书写简单而且使意义更为明确,增强了可读性。9.2结构体类型
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生信息表中,学号可为整型或字符串型,姓名应为字符串型,年龄应为整型,性别应为字符型,成绩可为整型或实型。如表9.1所示:学号姓名性别性别成绩1001TomM19901002JackM2085.51003LucyF1895.5表9.1学生信息表9.2.1结构体类型的定义
1.定义一个结构的一般形式struct结构体类型名
{类型标识符成员名1;类型标识符成员名2;
……
类型标识符成员名n;
};其中:struct是关键字,其功能为用来定义结构体。9.2.1结构体类型的定义
2.定义结构体类型举例(1)如表9.1学生信息包括:学号、姓名、性别、年龄、成绩。定义如下:structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/};
在这个结构体中,structstudent为结构体类型名,它有5个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为age,整型变量;第四个成员为score,实型变量。注意:在括号后的分号是不可少的;结构体类型名和成员名的命名应符合标识符的书写规定;结构定义之后,即可进行变量说明,凡说明为structstudent结构的变量都由上述4个成员组成。9.2.1结构体类型的定义
2.定义结构体类型举例(1)如表9.1学生信息包括:学号、姓名、性别、年龄、成绩。定义如下:structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/};
在这个结构体中,structstudent为结构体类型名,它有5个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为age,整型变量;第四个成员为score,实型变量。注意:在括号后的分号是不可少的;结构体类型名和成员名的命名应符合标识符的书写规定;结构定义之后,即可进行变量说明,凡说明为structstudent结构的变量都由上述4个成员组成。9.2.1结构体类型的定义
2.定义结构体类型举例(2)如果考虑10门课的成绩,加上总成绩与平均成绩,可作如下定义:
structstudent1{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore[10];/*10门课的成绩成绩*/floatsum,ave;/*总成绩,平均成绩*/};9.2.1结构体类型的定义
2.定义结构体类型举例(3)在表9.1所表示的学生信息里再加上出生年月日的信息,即结构体student嵌套结构体date成员:structstudent2{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/structdatebirthday;/*出生日期*/};structdate{intyear;/*年*/intmonth;/*月*/intday;/*日*/};9.2.2结构体变量定义、成员引用和初始化1.结构体变量的定义说明结构变量有以下三种方法。以上面定义的student为例来加以说明。(1)先定义结构,再说明结构变量。
structstudent{intnum;charname[20];charsex;intage;floatscore;};/*结构体类型定义*/structstudents1,s2;/*变量s1、s2为student类型*/9.2.2结构体变量定义、成员引用和初始化1.结构体变量的定义说明结构变量有以下三种方法。以上面定义的student为例来加以说明。(1)先定义结构,再说明结构变量。
structstudent{intnum;charname[20];charsex;intage;floatscore;};/*结构体类型定义*/structstudents1,s2;/*变量s1、s2为student类型*/9.2.2结构体变量定义、成员引用和初始化1.结构体变量的定义(2)在定义结构类型的同时说明结构变量。
structstu{intnum;charname[20];charsex;intage;floatscore;}s1,s2;/*s1、s2紧跟在结构体定义后,中间没有标点符号*/9.2.2结构体变量定义、成员引用和初始化1.结构体变量的定义(3)直接说明结构变量。
struct{intnum;charname[20];charsex;intage;floatscore;}s1,s2;/*省略了结构体的类型名*/9.2.2结构体变量定义、成员引用和初始化1.结构体变量的定义说明:(1)类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配存储空间的,只对变量分配存储空间。(2)对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量。(3)成员也可以是一个结构体变量(4)成员名可与程序中的变量同名,两者不代表同一对象。例如,程序中可以另定义变量num,它与structstudent中的num是两回事,互不干扰。9.2.2结构体变量定义、成员引用和初始化(5)使用typedef说明结构体类型。例如:
typedefstructstu{charname[20];intage;charsex;}STU;
定义新的类型符号STU来代替structstu的结构类型,然后可用STU来说明结构变量:
STUbody1,body2;
等效于:structstubody1,body2;9.2.2结构体变量定义、成员引用和初始化2.结构体变量成员的引用在程序中使用结构变量时,往往不把它作为一个整体来使用。除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。表示结构变量成员的一般形式是:结构变量名.成员名例如:
s1.num即第一个人的学号
s2.sex即第二个人的性别如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。例如:
s1.birthday.month即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。9.2.2结构体变量定义、成员引用和初始化3.结构体变量的初始化和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。例9.4
对结构变量初始化。voidmain(){structstudent/*定义结构*/{intnum;char*name;/*姓名可以定义为指针指向字符数组类型*/charsex;intage;floatscore;}s2,s1={1002,"Jack",'M',20,85.5};s2=s1;printf("%-12s%-12s%-12s%-12s%-12s\n","学号","姓名","性别","年龄","成绩");printf("%-12d%-12s%-12c%-12d%-12.2f\n",s1.num,,s1.sex,s1.age,s1.score);printf("%-12d%-12s%-12c%-12d%-12.2f\n",s2.num,,s2.sex,s1.age,s2.score);}9.2.3结构体数组的定义、初始化和引用举例1.结构体数组的定义structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/}s[5];
定义了一个结构数组s,共有5个元素,s[0]~s[4],每个数组元素都具有structstudent的结构形式,结构体数组的定义如结构体变量定义一样,可以有9.1.1节中介绍的3种定义方式。9.2.3结构体数组的定义、初始化和引用举例2.结构数的初始化
structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/}s[5]={{1001,"Tom",'M',19,90},{1002,"Jack",'M',20,85.5},{1003,"Lucy",'F',18,95.5},{1004,"Lily",'F',18,52},{1005,"Join",'M',19,75.5}};
当对全部元素作初始化赋值时,也可不给出数组长度。9.2.3结构体数组的定义、初始化和引用举例3.引用和举例结构体数组的成员引用与结构体变量相同,如:s[0].num代表第0号学生的学号,s[1].name代表第1号学生的姓名。例9.5
已定义且初始化好结构体数组如上,计算平均成绩,并输出不及格学生的姓名。voidmain(){inti;floatave,sum=0;printf("不及格学生有:\n");for(i=0;i<5;i++){sum+=s[i].score;if(s[i].score<60)printf("%s,",s[i].name);}ave=sum/5;printf("\n平均值为%f\n",ave);}9.2.4结构体指针变量1.指向结构体变量的指针一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量。结构指针变量说明的一般形式为:
struct结构名*结构指针变量名例如,在前面的例题中定义了student这个结构,如要说明一个指向student的指针变量pstu,可写为:
structstudent*pstu;9.2.4结构体指针变量2.指向结构体数组元素的指针structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/1002JackM2085.5intage;/*年龄*/floatscore;/*成绩*/}s[5]={{1001,"Tom",'M',19,90},{1002,"Jack",'M',20,85.5}},*ps;
若想使指针ps指向结构体数组s的第一个元素,可以如下赋值:
ps=s;/*s为数组的首地址,ps等于数组首地址*/
或者:ps=&s[0];9.2.4结构体指针变量2.指向结构体数组元素的指针注意以下几种表示的区别:(1)(*ps).num和ps->num表示s[0]的成员num;(2)++ps->num表示先取s[0]的成员num再自加,取成员符号“.”和“->”优先级高于自加、自减运算;(3)(++ps)->num表示指针ps先自加,指向下一个元素,即指向了s[1],再取其成员num。9.2.4结构体指针变量2.指向结构体数组元素的指针例9.6
有以下程序,程序的运行结果是()。
#include<stdio.h>
structord
{intx,y;}dt[2]={1,2,3,4};
main()
{structord*p=dt;printf("%d,",++p->x);
printf("%d\n",++p->y);
}
A)1,2
B)2,3
C)3,4
D)4,1【解析】:本题中指针变量p指向结构体数组dt的第一个元素,第一个输出的数为++p->x,由于取成员符号->比自加符号高,p->x为1,自加输出后为2;p->y为2,自加后为3,第二个输出的数为4。本题的正确答案为:B。9.2.5结构体在函数内的传递1.结构体变量的单个成员作函数参数结构体的每个变量可以是简单变量、数组、指针或构造类型等,它们可以作为函数参数进行传递。例9.8
有下列程序:structS{intn;inta[20];};voidf(int*a,intn){inti;for(i=0;i<n-1;i++)a[i]+=i;}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,10,9}};f(s.a,s.n);for(i=0;i<s.n;i++)printf("%d,",s.a[i]);}程序运行后的输出结果是()。A)2,4,3,9,12,12,11,11,18,9,B)3,4,2,7,9,8,6,5,11,10,C)2,3,1,6,8,7,5,4,10,9,D)1,2,3,6,8,7,5,4,10,9,A9.2.5结构体在函数内的传递2.结构体变量作函数参数主调函数中的结构体变量作为一个整体传送给相应的形参,系统将为结构体类型的形参开辟相应的存储单元,并将实参中各成员的值一一对应赋给形参中的结构体成员。根据参数的单向传递性,如果形参结构体成员发生了变化,但是不会传递给相应的实参,所以实参的结构体成员不会变。例9.9有以下程序#include<stdio.h>typedefstruct{intnum;doubles}REC;voidfun1(RECx){x.num=23;x.s=88.5;}main(){RECa={16,90.0};fun1(a);
printf(“%d\n”,a.num);}程序运行后的输出结果是
。169.2.5结构体在函数内的传递3.结构体变量的地址作函数参数结构体变量的地址作为实参传递,传递给一个基类型相同的结构体类型的指针变量。系统只需为形参指针变量开辟一个存储单元存放实参结构体变量的地址,而无需建立一个新的结构体变量,即节省了存储空间,提高了程序效率,又通过函数调用,有效地修改实参结构体中成员的值。例9.10下列程序的运行结果为
。#include<stdio.h>#include<string.h>
struct
A
{
int
a;charb[10];doublec;};
voidf(structA*t);
main(){structAa={1001,"ZhangDa",1098.0};f(&a);
printf("%d,%s,%6.lf\n",a.a,a.b,a.c);}void
f(struct
A
*t)
{strcpy(t->b,"ChangRong");}1001,ChangRong,1098.09.2.5结构体在函数内的传递4.结构体数组名作为函数参数结构体数组名作为实参,即将结构体数组的首地址传递给形参,如果形参中结构体数组的元素值发生了改变,那么也实参中相应元素值也发生了改变。例9.11将例9.10中的结构体变量a修改为结构体数组。例9.11列程序的运行结果为
。#include<stdio.h>#include<string.h>
struct
A
{
int
a;charb[10];doublec;};
voidf(structA*t);
main(){structAa[2]={1001,"ZhangDa",1098.0};f(a);
printf("%d,%s,%6.lf\n",a[0].a,a[0].b,a[0].c);}void
f(struct
A
t[])
{strcpy(t[0]->b,"ChangRong");}1001,ChangRong,1098.09.2.5结构体在函数内的传递5.函数的返回值是结构体类型例9.12有以下程序#include<stdio.h>#include<string.h>structA{inta;charb[10];doublec;};structAf(structAt);main(){structAa={1001,”ZhangDa”,1098.0};a=f(a);printf(“%d,%s,%6.1f\n”,a.a,a.b,a.c);}structAf(structAt){t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;returnt;}程序运行后的输出结果是()。A)1001,ZhangDa,1098.0B)1001,ZhangDa,1202.0C)1001,ChangRong,1098.0D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北黄石市大冶市高中学校高层次和急需紧缺人才引进招聘16人考试参考题库及答案解析
- 2026天津音乐学院附属中等音乐学校第一批招聘硕士及以上岗位9人考试参考试题及答案解析
- 2026江苏无锡泛航人才科技有限公司招聘考试参考试题及答案解析
- 2026广东珠海市斗门区退役军人服务中心招聘普通雇员2人考试参考题库及答案解析
- 2026山东临沂广视传媒有限公司招聘2人考试参考试题及答案解析
- 2026西安商贸物流集团有限公司招聘(27人)笔试备考题库及答案解析
- 小企业做内部管理制度
- 信用内部管理制度
- 企业内部立项管理制度
- 学生内部矛盾化解制度
- 常用避孕方法及护理PART课件
- 新版药品管理法培训课件
- 《新版标准日本语课课练》第17课
- GB/T 35150.7-2024新型干法水泥生产成套装备技术要求第7部分:脱硝系统
- 《行业会计比较》教案
- 湖北省襄阳市2024年中考数学试题(含解析)
- DB43T 1173-2016 钢-超高韧性混凝土轻型组合结构桥面技术规范
- 2024年西藏初中学业水平考试数学卷试题真题(含答案详解)
- 皮质层神经元群集动态
- 海岸工程全册配套完整课件
- JGT302-2022卷帘门窗规范
评论
0/150
提交评论