下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,结构、联合与枚举类型,第一节 结构类型 第二节 结构数组 第三节 结构指针 第四节 在函数之间传递结构 第五节 联合类型 第六节 枚举类型 第七节 用typedef定义类型 第八节 链表基础,问题的引出 用学号、姓名、性别、年龄、住址等属性来描述一个学生。 int num; char name20; char sex; int age; char addr30; 问题一:在程序中这些变量没有的内在联系。 问题二:如果有成百上千的学生,可能造成混乱。,一、结构类型的概念,第一节 结构类型,这些数据存放在内存的某个区域。 将此区域统一来使用,形成了结构体的概念。 结构是逻辑上相互联系的一组分量的
2、集合。 结构中的分量可以有不同的类型数据,结构中的分量称为结构的成员。,第一节 结构类型,比较简单数据类型时的变量说明语句: int i;,struct 结构体名 数据类型 成员名; 数据类型 成员名; 数据类型 成员名; ;,二、结构类型的定义,struct为关键字 结构体名是用户定义的类型标识。 中包围的是组成该结构的成员。,成员的数据类型既可以是简单的数据类型(int、char、float、double.),也可以是复杂的数据类型(数组类型和结构类型)。,第一节 结构类型,结构定义实例 为了描述日期可以定义如下结构: struct date int year; /* 年 结构成员的 */
3、 int month;/* 月 数据类型是 */ int day;/* 日 整型 */ ; 为了处理通信录,可以定义如下结构: struct address char name30; /* 姓名。字符数组 */ char street40; /* 街道名称 */ char city20; /* 城市 */ char state2; /* 省市代码 */ unsigned long zip; /* 邮政编码。 */ ;,第一节 结构类型,在定义了某种类型的结构体后,就可以使用该类型的结构变量。 用类型说明语句说明结构变量 struct 结构体名 结构变量名; 系统为所说明的结构变量按照结构定义时
4、说明的组成(成员分量),分配存储数据的实际内存单元。 例:将变量today说明为date型的结构变量: struct date today; 说明多个address型的结构变量: struct address wang, li, zhang; 结构变量同样有存储类型,存储特性与一般变量完全相同。,三、结构变量的说明,第一节 结构类型,结构变量占用内存情况 结构变量的各个成员分量在内存中占用连续存储区域,所占内存大小为结构中每个成员的占用内存的长度之和。 结构变量today和wang占用在内存的情况如图所示。,第一节 结构类型,关于结构类型的说明 类型与变量是不同的概念。 在定义结构变量时一般先
5、定义一个结构类型,然后 定义变量为该类型。 只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。 在编译时,对类型是不分配空间的,只对变量分配空间。 对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。 成员也可以是结构变量。 成员名可以与程序中的变量名相同时,二者不代表同一对象。,第一节 结构类型,在定义结构时说明结构变量 例如:struct student int num; char name20; char sex;int age; char addr30; student1,student2; 直接说明结构变量 例如:struct char name20; char
6、addr30; zhang;,第一节 结构类型,结构成员是另一个结构 例如:struct date int month; int day; int year; ; struct student int num;char name20; char sex;int age; struct date birthday; char addr30; student1,student2;,birthday,birthday,birthday,birthday,第一节 结构类型,访问结构中的成员是通过成员的名字,称为“按名引用”。在程序中使用结构中成员的方法为: 结构变量名.成员名称 例:将“92.10.0
7、1”送入today,对其各个成员分别赋值: today.year = 92; today.month = 10; today.day = 1; 指明结构成员的符号“.”是运算符,含义是访问结构中的成员。“.”操作的优先级在语言中是最高的。其结合性为从左到右。,四、引用结构变量的成员,第一节 结构类型,例:用结构描述一个人的基本情况,可以定义如下结构: struct person /* 定义person结构类型 */ char name30; char sex; struct date birthday; /* 结构的嵌套定义 */ man; 输入zhang先生的情况,如生日,可用如下语句: s
8、trcpy(,“zhang”); /*注意:不能写成=zhang; */ man.sex = M; /* 为结构中的字符成员赋值 */ man.birthday.year = 1960; man.birthday.month = 3; man.birthday.day = 28; /* 为嵌套定义的结构中的成员赋值 */,第一节 结构类型,输入zhang先生的情况,可用如下语句: strcpy(,“zhang”); /*注意:不能写成=zhang; */ man.sex = M; /* 为结构中的字符成员赋值 */ man.bir
9、thday.year = 1960; man.birthday.month = 3; man.birthday.day = 28; /* 为嵌套定义的结构中的成员赋值 */ 如果要将“zhang”改为“zhong”,只要将结构变量man中的数组成员name下标为2的元素a改为o即可。可以使用下列语句: 2=o; . /* 为结构变量中的数组成员的一个元素赋值 */,第一节 结构类型,五、对结构变量的整体操作,要对结构进行整体操作有很多限制,语言中能够对结构进行整体操作的运算不多,只有赋值“”和取地址“”操作。 例如:有 struct date sunday, today; 如果
10、today被赋值后,可用语句 sunday=today; 为sunday赋值。,第一节 结构类型,结构类型的引用说明 不能将一个结构变量作为一个整体直接访问。例如已定义student1为结构变量并且已有值。不能这样引用: printf(“%s,%c,%d,%d,%dn”,student1); 如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取等运算。例如,对上面定义的结构变量student1,可以这样访问各个成员: student1.sex student1.birthday.month stude
11、nt1.birthday.day student1.birthday.year,第一节 结构类型,对成员变量可以象普通变量一样进行各种运算。 student2.birthday.year=student1.birthday.year; sum = student1.birthday.month + 12; student1.age+; +student1.age; 可以引用成员的地址,也可以引用结构变量的地址。如: scanf(“%d”,第一节 结构类型,例:输入今天的日期,然后输出该日期。 #include main( ) struct date /* 在函数中定义结构类型date */ i
12、nt year, month, day; ; struct date today; /* 说明结构变量today */ printf (Enter today date(YYYY/MM/DD):); scanf(%d/%d/%d, ,例C10_103,第一节 结构类型,对结构变量进行初始化 在说明变量的同时,可以对每个成员置初值,称为结构变量的初始化,其一般形式为: 定义结构时说明变量 struct 结构体名 结构变量= 初始化数据 ; 类型说明语句 struct 结构体名 结构变量 = 初始化数据 ; 说明: 中的初始化数据用逗号分隔。注意数据的个数、数据类型、顺序要一一对应。,六、结构变量
13、的初始化,第一节 结构类型,例:用结构描述个人基本情况,打印个人档案。 struct date /* 在所有函数的外部定义结构date */ int year, month, day; struct person /* 在所有函数的外部定义结构person */ char name14, sex; struct date birthday; ; struct person xu= Xu lihui, M,1962,10,4; main( ) struct person fang= Fang jin,M,1963,9,13; struct person yuan= Yuan zhiping,M,
14、1963,10,5; /* 说明结构变量fang、yuan,并初始化结构变量 */,第一节 结构类型,printf(name sex birthdayn); printf(-n); printf(%-14s %-4c%4d.%2d.%2dn, , xu.sex,xu.birthday.year, xu.birthday.month, xu.birthday.day); printf(%-14s %-4c%4d.%2d.%2dn, ,fang.sex,fang.birthday.year, fang.birthday.month, fang.birthday.da
15、y); printf(%-14s %-4c%4d.%2d.%2dn, ,yuan.sex,yuan.birthday.year, yuan.birthday.month,yuan.birthday.day); ,例C11_104,第一节 结构类型,结构体数组说明语句的格式,对结构体数组的认识 是一个数组。 数组中的每一个元素的数据类型是结构类型。 例:为记录100个人的基本情况。可以说明一个有100个元素的数组。数组元素的基类型为结构。 struct person man100; man就是有100个元素的结构数组,数组的每个元素为 person 型。,标识符数组长度,str
16、uct 结构体名,第二节 结构数组,访问结构数组元素成员 必须遵守数组使用和访问结构成员的规定。 访问数组元素 按下标进行访问。 访问数组元素的成员,使用“.”运算符和成员名。 例如:要将数组man中的 3号元素赋值为:Fangjin,M,1963,9,13, 就可以使用下列语句: strcpy( , Fangjin” ); man3.sex=M; man3.birthday.year=1963; man3.birthday.month=9; man3.birthday.day=13;,第二节 结构数组,将“Fangjin”改为“Fangjun”,修改其中的字母i: man3
17、.name5=u; /*为数组中元素的数组成员中的一个字符赋值*/ 注意结构数组遵循数组的性质 数组元素的起始下标从0开始, 数组名表示该结构数组的存储首地址。 结构数组存放在连续的内存区域中,所占内存大小为结构类型的大小乘以数组元素的数量。 sizeof(struct person),struct person man100长度 = 37 * 100 = 3700 字节,?,第二节 结构数组,例:简单的密码加密程序。 加密过程是先定义一张字母加密对照表。将需要加密的文字输入加密程序,程序根据加密表中的对应关系,将输入的文字加密输出。对加密表中未出现的字符则不加密。 输入 输出 输入 输出 输
18、入 输出 输入 输出 输入 输出 a d b w c k d ; e i i a k b ; c w e struct table/* 定义结构table */ char input;/* 成员input存输入的字符 */ char output;/* 成员output存输出的字符*/ ; /*外部结构数组translate并初始化*/ struct table translate = a,d,b,w, c,k,d,;,e,i, i,a,k,b,;,c,w,e ; /* 建立加密对照表 */,第二节 结构数组,“struct table translate =.”有三个作用: 说明了一个外部的
19、结构数组translate, 表示数组的大小由后面给出的初始化数据决定, 对结构数组进行初始化。在程序中给出了数组初始化数据,所以结构数组translate有9个元素。,第二节 结构数组,struct table char input, output; ; struct table translate = a,d,b,w,c,k, d,;,e,i,i,a, k,b,;,c,w,e ; main( ) char ch; int str_long, i; str_long = sizeof(translate)/sizeof(struct table); /* 计算元素个数 */ while(ch
20、=getchar( ) != n) for(i=0;translatei.input!=ch /* 原样输出 */ ,例C11_201,第二节 结构数组,例:分析程序运行结果 struct s int x; int *y; /* y: 是指向整型的指针 */ int data5=10,20,30,40,50; /* data:整型数组 */ struct s array5=100, /* array: 结构数组,初始化 */ 结构数组array的每个元素有两个成员,初始化后的状态如下。,第二节 结构数组,main ( ) int i=0; /* 说明变量i并赋初值 */ struct s s_
21、var; /* s_ver: 一般的结构变量 */ s_var = array0; /*将结构数组array0整体赋给s_var */ printf(%dn, s_var.x); printf(%dn, *s_var.y); printf(For array:n); printf(%dn, arrayi.x); printf(%dn, *arrayi.y); printf(%dn, +arrayi.x); printf(%dn, + *arrayi.y); printf(%dn, array+i.x); printf(%dn, * + arrayi.y); printf(%dn,(* arra
22、yi.y) +); printf(%dn, * (arrayi.y +); printf(%dn, * arrayi.y +); printf(%dn, * arrayi.y); ,第二节 结构数组,(i=0): s_var = array0;,100,10,100, s_var.x 取s_var的成员x的值 * s_var.y 取s_var的成员指针y所指的内容, arrayi.x 取arrayi的x的值 * arrayi.y 取arrayi的指针y所指的内容,10,10,100 10,100 10,第二节 结构数组, + arrayi.x 取arrayi的x的值,x加1后输出 + * ar
23、rayi.y 取arrayi的指针y所指的内容, y的内容加1后输出,100,101,10,11,1,200,30, array +i .x i先加1后取arrayi的x的值,输出 * + arrayi.y 将arrayi的指针y先加1后再取y所 指的内容,输出,101 11,200 30,第二节 结构数组, (*arrayi.y)+ 取arrayi的指针y的内容,输 出,y的内容再加1 *(arrayi.y+)取arrayi的指针y的内容,输 出,指针y再加1,30,31,40,50, *arrayi.y +同 * (arrayi.y+),由于运 算的结合性隐含了括号,输出 *arrayi.
24、y 输出,例C10_202,30 31,40 50,第二节 结构数组,类似于指向基本数据类型的指针的概念,将结构体变量的地址赋给另一个变量,这就是指向结构体的指针(简称为结构指针)。 结构指针说明的一般形式 struct 结构体名 * 标识符; 例如: struct date * pdate, today; 执行语句:pdate = 结果:,一、结构指针的概念,第三节 结构指针,通过结构指针访问成员采用运算符“-”进行操作。 结构指针-成员名 “-”运算符有最高的优先级,结合性从左至右。 通过结构指针pdate访问成员year的操作就可以写成: pdate-year = 1963; 等价于:
25、today.year = 1963; (*pdate).year = 1963; 辨疑: pdate-year *pdate-year,二、通过结构指针访问结构体的成员,例C10_301,第三节 结构指针,例:用结构指针改写加密程序 struct table char input, output; struct table transl= a,d,b,w,c,k, d,;,e,i,i,a, k,b,;,c,w,e,; main() char ch; struct table *p, *pend; /* p和pend为向结构指针 */ pend= ,第三节 结构指针,例.C:请分析程序的运算结果
26、 struct s int x, *y; /* y: 结构中的成员是指向整型的指针 */ * p; /* p: 指向结构的指针 */ int data5=10,20,30,40,50,; /*data: 整型数组 */ struct s array5=100, /* array: 结构数组 */,第三节 结构指针,main ( ) p = array; /* 指针p指向结构数组的首地址 */ printf(%dn, p-x); printf(%dn, (*p).x); printf(%dn, *p-y); printf(%dn, *(*p).y); printf(%dn, +p-x); printf(%dn, (+p)-x); printf(%dn, p-x+); printf(%dn, p-x); printf(%dn, +(*p-y); printf(%dn, +*p-y); printf(%dn, *+p-y); printf(%dn, p-x); printf(%dn, *(+p)-y); print
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届黑龙江省哈尔滨市十七中学初三下学期自主练习英语试题含解析
- 品牌形象策划及宣传素材工具箱
- 服务质量承诺保证函范文6篇
- 碳排放监测设备采购单确认函(9篇范文)
- 时尚圈品牌口碑维护承诺函范文6篇
- 行政事务审批流程标准化作业手册
- 客户信息收集与分类管理工具集
- 企业人才选拔与晋升管理体系
- 区域特色食品承诺书3篇
- 启动会后商务合作意向书4篇
- (广东一模)2026年广东省高三高考模拟测试(一)英语试卷(含官方答案)
- NB/T 11757-2024低压统一电能质量调节器技术规范
- 食品安全管理制度
- 2026中国石化云南石油分公司加能站后备站长招聘150人易考易错模拟试题(共500题)试卷后附参考答案
- 业务跟单工作制度
- 2026年河南省公务员录用考试申论真题
- 人教版(2024)物理 八年级下册 第七章 力 章末练习(无答案)
- 城市供水系统维护与应急处理操作手册(标准版)
- 变配电室平面布置设计方案
- 保温工程绩效考核制度
- 误吸的护理应急预案
评论
0/150
提交评论