第十章 结构体与共用体_第1页
第十章 结构体与共用体_第2页
第十章 结构体与共用体_第3页
第十章 结构体与共用体_第4页
第十章 结构体与共用体_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、第十章 结构体与共用体10.1 概述有时需要将不同类型的数据组合成一个有机的整体,如:一个学生的基本情况:学号(int num),姓名(char name20),性别(char sex),年龄(int age),成绩(float score),地址(char addr30)C语言提供了这样一种数据结构,称为结构体。结构体定义的一般形式:或称“域表”struct 结构体名 成员表列 ;如:一个学生的基本情况可定义如下struct student int num; 2字节 char name20; 20字节 char sex; 1字节 int age; 2字节 float score; 4字节 c

2、har addr30; 30字节 ; 59字节10.2 定义结构体类型变量的方法三种方法:一先定义结构体类型,再定义变量:struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;注意:struct student 是一个整体来定义结构体变量的。二在定义类型的同时定义变量struct student int num; char name20; char sex; int age; float score; char addr30; st

3、u1,stu2;三直接定义结构体类型变量struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;说明:1成员也可以是一个结构体变量。如:struct date int month; int day; int year;struct student1 int num; char name20; char sex; int age; struct date birthday; char addr30; stu3;numnamesexagebirthdayaddrmonthdayyear2

4、成员名可以与程序中的变量名相同。10.3 结构体类型变量的引用对结构体变量的引用,一般是分别引用其成员,引用方式为:结构体变量名.成员名 (由此可与函数中同名的变量区分)如: stu1.num , stu1.age其中“.”为成员运算符,它在所有的运算符中优先级最高。若成员的类型又是一个结构体,则要用多个成员运算符:stu3.birthday.year (只能对最低级的成员进行赋值或存取及运算)成员变量与一般的变量是一样的。如:I/O操作:scanf(“%d”,&stu1.num);printf(“name=%sn”,);赋值操作:stu2.age=25;stu3.age=s

5、tu2.age;stu1.age+;stu3.birthday.day+;在有些系统中允许将一个结构体变量直接赋给另一个具有相同结构体类型的变量,如: stu1=stu2 (Turbo C也可以)可以引用成员变量的地址,也可以引用结构体变量的地址。如:scanf(“%d”,&stu3.birthday.year);printf(“%x”,&stu1);10.4 结构体变量的初始化把各成员的值放在大括号内,用逗号分隔。如:struct student long num; char name20; char sex; char addr30; a=99031,”Lilin”,M,”123 Beij

6、ing Road”;10.5 结构体数组一结构体数组的定义也有三种方式:1struct student int num; char name20; char sex; int age; char addr30; ;struct student stu3;2struct student int num; char name20; char sex; int age; char addr30;stu0stu1stu2 stu3 ;3struct int num; char name20; char sex; int age; char addr30; stu3 ;数组各元素在内存中连续存放。二结构

7、体数组的初始化struct student long num; char name20; char sex; int age; char addr30; stu3= 99031,”Lilin”,M,18,”123 Beijing Road”,99032,”Zhang san”,M,20,”130 Shanghai Road”,99033,”Lisi”,F,19,”1010 Zhongshan Road”;在定义数组时,若对所有元素都进行了初始化,也可以不指定元素的个数:struct student stu=,;三结构体数组元素的引用如: stu0.num stu2.age例

8、:对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include “string.h”struct person char name20; int count;leader3=“Li”,0,”Zhang”,0,”Wang”,0;main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for (j=0;j3;j+) if (strcmp(leader_name,)=0) leaderj.count+; printf(“n

9、”); for (i=0;i为指向结构体成员运算符。括号不能省略,否则*p.num相当于*(p.num)。2引用p=&stu1;stu1.num 即为 (*p).num 或 即为 (*p).name 或 p-name二指向结构体数组的指针struct student long num; char name20; char sex; int age; char addr30; stu3= 99031,”Lilin”,M,18,”123 Beijing Road”,99032,”Zhang san”,M,20,”130 Shanghai Road”,99033,”Li

10、si”,F,19,”1010 Zhongshan Road”;main() struct student *p; printf(“ No Name Sex Age Addrn”); for (p=stu; pnum,p-name,p-sex,p-age,p-addr); 注意:若p指向stu的第一个元素(即p=stu),则:p-age+ 相当于 stu0.age+p-age 相当于 +stu0.age(p+)-age 先得到p-age值为18,而后p+即p指向stu1(+p)-age 先p+即p指向stu1,再取p-age值为20三用指向结构体的指针作函数参数例:有一个结构体变量stu,内含学

11、生学号,姓名和3门课程的成绩。要求在main中赋值,在函数print中将它们打印输出。#include “string.h”#define FORMAT “%dn%sn%fn%fn%fn”struct student int num; char name20; float score3; ;main() void print(struct student *p); struct student stu; stu.num=1234; strcpy(,”Lili”); stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(&stu)

12、;void print(struct student *p) printf(FORMAT,p-num,p-name,p-score0, p-score1,p-score2);也可以用结构体变量的成员作为参数:print(stu.num,,stu.score0, stu.score1, stu.score2);另外,ANSI C允许用结构体变量作为参数,但必须保证实参与形参的类型相同。print(stu);但这两种方法都必须把成员一个个传递,费时费空间。一般采用指针作参数较好,能提高运行效率。10.7 用指针处理链表一链表概述链表是一种常见的重要的数据结构,它是动态地进行存储分配

13、的一种结构。(数组是静态的存储结构)。下面介绍最简单的一种链表(单向链表)的结构:1249 A1356 B1475 C1021 DNULLhead1249135614751021链表由“结点”构成,结点包括两部分的内容:一部分为用户的信息(数据),通常包括各种类型的数据。另一部分为指向下一个结点的指针。为了表示链表的起始位置(起始结点),有一个指针指向第一个结点,存放这个指针的变量称为“头指针”变量(一般变量名为head)。结点一般采用结构体类型:struct student1 int num; float score; struct student1 *next;pheads二结点的插入操作

14、要将结点s插入在p结点之后,可用如下操作:s-next=p-next;p-next=s;phead三结点的删除操作要将p结点的后一个结点删除,可用如下操作:s=p-next;p-next=p-next-next; (p-next=s-next;)free(s);四处理动态链表所需的函数这些函数所包含的文件:ANSI标准包含在“stdlib.h”中;而多数C系统包含在“malloc.h”中;Turbo C包含在“alloc.h”中。1malloc函数函数原型:void *malloc(unsigned int size)作用:在内存中分配一个长度为size字节的连续空间。 返回指向分配域的起始地

15、址指针,若不成功则返回空指针(NULL)。如: int *p; p=(int *)malloc(sizeof(int);分配一个结点:struct student1 int num;或 sizeof(stu) float score; struct student1 *next; stu,*p;p=(struct student1 *)malloc(sizeof(struct student1);2calloc函数函数原型:void *calloc(unsigned n ,unsigned size)作用:在内存中分配n个长度为size字节的连续空间。 返回指向分配域的起始地址指针,若不成功则

16、返回空指针(NULL)。3free函数函数原型: void free(void *p)作用: 释放由p指向的内存空间,无返回值。10.8 共用体一 共用体的概念几个不同类型的变量存放在同一段内存单元中(它们的起始地址是一样的)共用体定义的一般形式:union 共用体名 成员表列chif 变量表列;如: union data int i; char ch; float f; a,b,c;或union data int i; char ch; float f; union data a,b,c;或union int i; char ch; float f; a,b,c;共用体变量占用内存的长度等于

17、最长成员的长度。而结构体变量占用内存长度为各成员长度之和。二共用体变量的引用方式不能直接引用共用体变量名,而只能引用共用体变量中的成员。如: a.i a.ch a.f三共用体类型数据的特点在使用共用体类型数据时要注意以下一些特点:1共用体变量中的成员不能同时都起作用,在某一时刻只能一个成员起作用(有意义),其他成员则是无意义的。起作用的成员是最后一次存入数据的成员。如:main() union data int i; char ch; a;a.ch=a;printf(“n%d,%dn”,a.ch,a.i);a.i=266;printf(“n%d,%dn”,a.ch,a.i); 2共用体变量的地

18、址与它的各成员的地址是一样的。即: &a=&a.i=&a.ch3不能直接引用共用体变量名,也不能对它进行初始化。4不能把共用体变量作为函数参数,也不能使函数返回一共用体类型数据。但可以使用指向共用体变量的指针作为函数参数。5结构体类型的成员可以是共用体类型的,共用体的成员也可以是结构体的和数组。也可以定义共用体数组。如何知道应该使用共用体变量中的哪一个成员呢?一般使用一个变量用来标记应使用哪个成员。如:struct union int i; char ch; float f; da; int type; a;a.da.f=1.5;a.type=3;switch (a.type) case 1:

19、 printf(“%dn”,a.da.i); break; case 2: printf(“%cn”,a.da.ch); break; case 3: printf(“%fn”,a.da.f); break;10.9 枚举类型枚举类型是ANSI C新标准所增加的,“枚举”的含义为可以一一列举出来的。称为枚举元素或枚举常量。枚举类型的定义:enum weekday sun,mon,tue,wed,thu,fri,sat;枚举变量的定义:enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday day1,day2;或enum weekday sun

20、,mon,tue,wed,thu,fri,sat day1,day2;或enum sun,mon,tue,wed,thu,fri,sat day1,day2;说明:1在定义枚举类型时 内的标识符(枚举常量)不能相同, 如: enum ch a,b,c,a,i,p; 错误。 这些标识符在程序中也不能作为其它用处:如: enum ch a,b,c,d;main() int a; char c;2枚举元素按常量处理(称为枚举常量),它们不是变量,不能对它们赋值。3枚举元素是有值的,C编译按定义时的顺序使它们的值为0,1,2,。如 main() enum weekday sun,mon,tue,wed,thu,fri,sat day; printf(“n”); for (day=sun;day=sat; day+) printf(“%4d”,day); 也

温馨提示

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

评论

0/150

提交评论