收藏 分享(赏)

大学C语言 第六章结构体和共用体.ppt

上传人:tkhy51908 文档编号:8165669 上传时间:2019-06-12 格式:PPT 页数:26 大小:73.50KB
下载 相关 举报
大学C语言 第六章结构体和共用体.ppt_第1页
第1页 / 共26页
大学C语言 第六章结构体和共用体.ppt_第2页
第2页 / 共26页
大学C语言 第六章结构体和共用体.ppt_第3页
第3页 / 共26页
大学C语言 第六章结构体和共用体.ppt_第4页
第4页 / 共26页
大学C语言 第六章结构体和共用体.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、第6章 结构体与公用体,6.1 结构体概述6.1.1 结构体的引入存放一个班学生的成绩可以定义数组,但是如果要存放一个同学的学号、姓名、成绩、住址信息,如何定义数据类型。常常把这些关系密切但类型不同的数据项组织在一起,即“封装”起来,并为其取一个名字,在C语言中,就称其为结构体(有些高级语言称之为记录)。所以,结构体通常是由不同数据类型的数据项组成,一般也称是由不同成员组成,因此可以说:一个结构体可包含若干成员,每一个成员可具有不同的名字及数据类型。 结构体的引入为处理复杂的数据结构提供了有力的手段。,6.1.2 结构体类型的定义和简单类型不同,简单类型是由系统预定义的,如int、float、

2、char,直接可以使用。而结构体类型是根据需要由程序员自行定义,因此在使用之前必须先定义结构体类型。 结构体类型定义的一般格式: struct 结构体名 结构体成员表; ; 其中struct是关键字,称为结构体定义标识符,而结构体名则由程序员自己命名。大括号中的结构体成员表包含若干成员,每一个成员都具有如下的形式:数据类型标识符 成员名;,对一个学生的描述,其结构体类型定义如下: struct stud_type char name10; /* 姓名 */ long num; /* 学号 */ char sex; /* 性别 */ int age; /* 年龄 */ float score;

3、/*成绩*/ char address10; /*家庭住址*/ ;,说明(1) 定义一个结构体类型只是描述了此结构体的组织形式,在编译时并不为其分配存储空间,即仅描述此数据结构的形态或者说模型,故不能对定义的一个结构体类型进行赋值、存取或运算。 (2)结构体的成员可以是简单变量、数组、指针、结构体或公用体等。 (3)结构体类型定义可以放在函数内部,也可以放在函数外部。若放在内部,则只在函数内有效;若放在外部,则从定义点到源文件尾之间的所有函数都有效。 (4)结构体成员的名字可以同程序中的其它变量同名,二者不会相混,系统会自动识别它。,6.2 结构体变量6.2.1 结构体变量的定义与初始化 1结

4、构体变量的定义 同其它变量一样,结构体变量也必须先定义,然后才能引用。一个结构体变量的定义可以有以下三种方式: (1) 先定义类型再定义变量 其形式:,struct stud_type char name10; long num; char sex; int age; float score ; char address10; ; struct stud_type student1, student2;,(2) 在定义类型的同时定义变量 其形式: struct stud_type student1, student2; (3) 直接定义结构体变量 其形式: struct student1,st

5、udent2;,说明(1) 在定义结构体类型时,系统并不分配内存空间,仅当定义结构体变量时,系统才为被定义的每一变量分配相应的存储单元。如上面定义的结构体变量student1、student2在内存中各占31个字节(10+4+1+2+4+10=31) (2) 结构体变量的定义一定要在结构体类型定义之后或同时进行,对尚未定义的结构体类型,不能用它来定义结构体变量。 如:对一个教师teacher的结构体类型未作定义,则下面的变量定义 struct teah_type teacher;是错误的;或如前所述一个结构体成员birthday(也称结构体成员变量),若其类型未作定义,就写struct dat

6、e_type birthday; 也是错误的。,2. 结构体变量的初始化所谓结构体变量初始化,就是在定义结构体变量的同时,对其成员变量赋初值,在赋值时应注意按顺序及类型依次为每个结构体成员指定初始值。 结构体初始化的一般格式为: struct 结构体类型名 结构体变量=初始化值; 说明 (1)初始化数据之间用逗号分隔。 (2) 初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为0(若成员是指针,则初始化为NULL)。 (3) 初始化数据的类型要与相应成员变量的类型一致。 初始化时只能对整个结构体变量进行,不能对结构体类型中的各成员进行初始化赋值。,例: struc

7、t date_type int year; int mouth; int day; ; struct stud_type char name10;long num;char sex;struct date_type birthday;float score;char address10; main() struct stud_type student1=“wang“,196103,m,1978,10,12,98,“Xian“; struct stud_type student2=“liu“,196105,m,1980,9,22,88,“Benjing“; ,6.2.2 结构体变量的引用1. 对

8、结构体变量成员的引用 在C语言程序中,不准许对结构变量整体进行各种运算、赋值或输入输出操作,而只能是对其成员进行此类操作。 引用结构体变量成员的一般形式: 结构体变量名.成员名 其中“.“是结构体成员运算符,其优先级别最高,结合性是自左至右。由此对结构体成员就完全可以像操作简单变量一样操作它。 如:对上例定义的结构体变量student1或student2,可作如下的赋值操作: student1.name10= “wang“; student1.num=196103; student1.sex=m; student1.birthday.year=1978; student1.birthday.m

9、outh=10; student1.birthday.day=12; student1.score=98;,2. 对结构体变量整体的引用结构体变量和简单变量相比,除了上面所述在参加各种运算、赋值或输入输出方式上有所不同外即是由结构体变量成员完成,其它同简单变量一样,如: (1) 可以相互赋值,但注意相互赋值的两个结构体变量必须是同一个结构体类型; 如:student1=student2; (2) 可作为函数的形参、实参或函数返回值。,6.2.3 结构体变量作为函数参数结构体变量成员作函数参数结构体变量中的所有成员都可作为函数参数 struct stud_type char name10; lo

10、ng num; char sex; student1; 现将结构体变量student1的三个成员分别传递给函数 func1,func2,func3: func1(student1.name); func2(student1.num); func3(student1.sex);,2. 结构体变量整体作函数参数 老板本的C系统不允许用结构体变量作函数参数,只允许用指向结构体变量的指针作函数参数(参见指针章节),传递的是结构体变量的首地址。而ANSI C取消了这一限制,规定按值传递方式。在函数调用时,系统为形参结构体变量分配存储空间,并从相应的实参结构体变量中取得各成员的值,若对形参中结构体变量各成

11、员值进行修改,并不能修改实参结构体变量各成员的值。这里要注意,实参和形参结构体变量类型应当完全一致。,6.3 结构体数组6.3.1 结构体数组的定义与初始化 1. 结构体数组的定义 在定义结构体数组时其定义方法与定义结构体变量方法类似,也有三种形式。 定义如下: struct date_type int year;int mouth;int day; ; struct stud_type char name10;long num;char sex; struct date_type birthday; float score; char address10; ; struct stud_typ

12、e student3; 由此就定义了一个结构体数组student,它有3个元素,每个元素都是struct stud_type类型,各占35个字节(10+4+1+(2+2+2)+4+10=35)。,2. 结构体数组的初始化结构体数组在定义的同时可以初始化。其一般格式是在定义之后紧跟一个用花括号括起来的一组初始数据,为了增强可读性,最好使每一个数组元素的初始数据也用花括弧括起来,以此来区分各个数组元素。 对上所定义的结构体数组student初始化如下: stuct stud_type student2= “wang“,196103, m,1978,10,12,98, “xian“,“zhang“,

13、196102, f,1977,1,10,87, “Beijing“;,说明 (1) 可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或赋给同一类型的变量。 如: struct stud_type student3, student1; 现在就定义了一个结构体数组student,又定义了一个结构体变量student1,则下面的赋值合法。 studentlstudent0; student0=student1; studnet1=student1; (2) 不能把结构体数组元素作为一个整体直接进行输入或输出。 如 printf (“%d“,student0);或scanf(“%d“,

14、&student0); 只能以单个成员为对象进行输入输出,如: scanf(“%s“, student0.name); scanf(“%ld“,student0.num); printf (“%s%ldn“, student0.name, student0.num);,例6.4:从键盘输入10名学生信息,每个学生有姓名、学号、成绩,要求按学生成绩降序排列,并输出学生成绩排行榜。,#define N 10 #include struct stud_type char name10;int num; int score; ; struct stud_type stuN;,main() int i,

15、j,k;struct stud_type stuN,t; printf(“n请输入 %d 个学生的姓名 学号 成绩 n“, N); for(i=0;iN;i+)scanf(“%s%d%d“,stui.name , ,for(i=0;iN-1;i+)k=i;for(j=i+1;jN;j+)if(stuk.scorestuj.score)k=j;t=stui;stui=stuk;stuk=t;,数组名作为函数参数数组名代表一个数组的首地址,将数组名作为函数参数(实参)实际是将实参数组的首地址传递给对应的形参,这时形参也应该是一个数组,形参数组的定义可以不指定大小。,结合方式:形参数组与实参数组公用

16、存储空间,a02000,a 2000,2002,x0,x1,a9,x9,这样在被调函数中对形参数组x的改变也就间接达到了对实参数组a的改变a,例:设计一个函数,每调用一次可以在一个升序数列中插入一个数。,int insert (int s,int x,int n) int j=n-1;while(sjx ,如:x=3,3,2,1,0,j=3,j=2,j=1,j=0,#include void main() int a10=2,5,7,10;int d,n=4;scanf(“%d“, ,6.4 公用体在C语言中,允许不同数据类型使用同一存储区域,共用体就是一种同一存储区域由不同类型变量共享的数据

17、类型。它提供种方法能在同一存储区中操作不同类型的数据,也就是说公用体采用的是覆盖存储技术,准许不同类型数据互相覆盖。6.4.1 公用体类型定义公用体类型的定义与结构体类似,其一般定义格式如下: union 公用体名 公用体成员表; ; 其中union是关键字,称为公用体定义标识符,公用体名同样由程序员来命名。大括号中的公用体成员表包含若干成员,每一个成员都具有如下的形式:数据类型标识符 成员名;,如: union data int i;char ch;float f; ;,6.4.2 公用体变量定义与引用 1. 公用体变量的定义 union 公用体名 公用体成员表; 变量表列; 如: unio

18、n data int i;char ch;float f; a,b,c;,例6.5 将一个整数按字节输出main() union int_char int i;char ch2;x;x.i=24897;printf(“i=%dni=%on“,x.i,x.i);printf(“ch0=%o,ch1=%onch0=%c,ch1=%cn“,x.ch0,x.ch1,x.ch0,x.ch1); ,6.6 用typedef定义类型使用typedef语句为这些类型定义另外一个名称6.6.1 类型定义的含义及形式 typedef类型定义的含义是给某个已有的数据类型重新命名,即允许用户改变数据类型的名称,其形式

19、为: typedef 类型名 新名称; 例如: (1)typedef int INTEGER;(2)typerdef structchar name10;int num;float score3; STUDENT; 此后的程序中就可用STUDENT定义结构体变量,如:STUDENT student1,student2;。,说明 (1) 定义的新类型名一般使用大写字母,以便与系统的标准类型标识符相区别。 (2) 仅给已有的类型名重新命名,并不产生新的数据类型,原有的数据类型也没有被取代,即只是此类型的一个“别名”。如typedef int INTEGER;,只是给int 起了一个新的名字而已,int仍可用。 (3) 定义一个新的数据类型名,并没有定义变量,因而谈不上分配存储单元。 (4) typedef与#define有相似之处,如typedef int INTEGER; #defint INTEGER int;作用都是用INTEGER 代替int,但二者有本质的区别,前者是为int 定义了一个别名,而后者是宏代换。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报