C语言课件:10结构体与共用体_第1页
C语言课件:10结构体与共用体_第2页
C语言课件:10结构体与共用体_第3页
C语言课件:10结构体与共用体_第4页
C语言课件:10结构体与共用体_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、,第十章,结构体与共用体,2,内容提要,结构体(struct) 共用体(union) 枚举(enum) typedef 关键字,3,数据类型的分类,数据类型分为基本类型和构造类型。 基本类型是系统固有的。用户只能使用,不能改变。 基本类型分为整型、实型、字符型、指针型、空类型。 在编程时,用户经常会需要一些系统没有的数据类型,即用户想自己定义新的数据类型,为方便用户编程,C语言为用户提供了自定义数据类型的机制,可以由基本类型派生构造出来,因此自定义数据类型又叫做构造类型。 构造类型分为数组、结构体、共用体、枚举。,4,C语言的数据类型,规定:在程序中用到的变量,必须指定数据类型。,5,结构体,

2、结构体简称结构。 通常将在逻辑上有相互联系的一组数据定义成一个结构。 结构中的组成成分称为分量、域、成员。 结构中的成员的数据类型可以不同。,int num; char name20; char sex; int age; char addr30;,struct student int num; char name20; char sex; int age; char addr30; ;,判断:对于不同类型的数据,若想合成一个有机的整体,可以使用结构体进行定义。Y,6,结构体类型的定义,在使用结构之前,首先要对结构的组成进行描述,称为结构的定义。 结构定义要说明组成该结构的成员(成员名命名规则

3、遵循标识符命名规则),以及每个成员的数据类型。 实际上,结构定义是定义一个新的数据类型,因此要指定结构体的类型名(遵循标识符命名规则)。,struct 结构体类型名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ;,判断:在程序中定义了一个结构体类型后,可以多次用它来定义具有该类型的变量。 Y,分号结束,7,结构体变量的定义,要注意类型与变量的区别,要先定义类型,再利用这个类型来定义变量。如同定义一个整型变量一样,如int a,先有类型int(系统固有的),再根据类型定义变量a。 系统只对变量分配存储单元,不对类型分配存储单元。,main( ) int a; struct

4、student s1, s2; ,struct student int num; char name20; char sex; int age; char addr30; ;,类型,变量,结构体是不同数据类型的数据集合,作为数据类型,必须先说明结构体 类型 ,再说明结构体 变量 。,8,定义结构体变量的多种方法先定义类型,再定义变量,struct student int num; char name20; char sex; int age; char addr30; ; main( ) int a; struct student s1, s2; ,struct student int num

5、; char name20; char sex; int age; char addr30; ; #define STUDENT struct student main( ) int a; STUDENT s1, s2; ,推荐,9,定义结构体变量的多种方法定义类型时, 同时定义变量,struct student int num; char name20; char sex; int age; char addr30; s1, s2; /全局变量 main( ) int a; struct student st; /局部 ,main( ) int a; struct student int n

6、um; char name20; char sex; int age; char addr30; s1, s2; /局部变量 /结构体类型也是局部的。 fun( ) struct student st; /错误 ,10,定义结构体变量的多种方法直接定义结构体变量,struct /无名结构体 int num; char name20; char sex; int age; char addr30; s1, s2; /全局变量 main( ) int a; /无法使用上面的类型 ,main( ) int a; struct /无名结构体 int num; char name20; char sex

7、; int age; char addr30; s1, s2; /局部变量 ,11,结构体变量的使用圆点运算符,可以利用结构体变量名和成员运算符(圆点运算符)访问结构体变量中的成员。 圆点运算符“ . ”属于成员运算符、域运算符、分量运算符。 结构体变量成员可以象普通变量一样进行各种运算。,main( ) struct student s1, s2; s1.num = 20; s2.num = 50; printf(%d %d, s1.num, s2.num - s1.num); /20 30 ,判断:对结构体类型的变量的成员的访问,无论数据类型如何都可使用的圆点运算符。Y,12,结构体变量的

8、使用箭头运算符,可以利用取地址运算符获得指向结构体变量的指针,并利用结构体指针变量和指向运算符(-运算符)访问结构体变量中的成员。 注意:结构体名仅表示结构体对象本身,并不表示结构体指针(与数组名、函数名不一样)。,main( ) struct student s, *p = /20 20,p-,13,结构体变量的使用成员运算符的优先级,圆点运算符和箭头运算符的优先级最高,从左向右结合。,main( ) struct student s, *p = /3 3 3 ,14,结构体变量的使用同类型结构体变量可互相赋值,两个类型相同的结构体变量,可以互相赋值。,#include struct sty

9、pe int a; int b; x, y; main( ) x.a = 10; x.b = 20; y = x; printf(%d %d, y.a, y.b); /10 20 ,15,结构体变量的初始化定义时初始化,struct student int num; char name20; char sex; int age; char addr30; ; struct student s=201101, zhang, m, 20, A501;,按结构体中成员的顺序,写出初值。注意类型匹配。,16,结构体变量的初始化执行时赋初值,struct student int num; char na

10、me20; char sex; int age; char addr30; ;,#include #include main( ) struct student s; s.num = 201101; strcpy(, zhang); s.sex = M; s.age = 20; strcpy(s.addr, A501); ,注意字符串的赋值方法。,17,结构体变量的输入,struct student int num; char name20; char sex; int age; char addr30; ;,#include #include main( ) struct stu

11、dent s; scanf(%d %s %c %d %s, ,结构体变量成员的使用与普通变量的使用一样,错误的用法: scanf(%d %s %c %d %s, ,用空白符分隔,18,结构体变量的输出,#include #include main( ) struct student s; /结构体类型定义同前页 scanf(%d %s %c %d %s, ,错误的用法: printf(%d,%s,%c,%d,%s, s);,19,结构体变量名、成员名、类型名可以相同。,struct a int a; int b; a;,合法,成员名也可以与结构体外的变量名或其它结构体内的成员名相同,二者并不代

12、表同一对象。,struct s1 int a; int b; ; struct s2 int a; float b; ; main( ) struct s1 x; struct s2 y; int a = 10; x.a = 20; y.a = 30; printf(%d %d %d, a, x.a, y.a); /10 20 30 ,20,结构体的嵌套,结构可以嵌套,结构中的成员还可以是结构。 被嵌套的结构可以是已定义的或正在定义的。,struct date int month; int day; int year; ; struct student int num; char name20

13、; struct date birthday; ; struct student s; struct data d;,struct student int num; char name20; struct date int month; int day; int year; birthday; ; struct student s; struct data d; /错!,21,结构体的嵌套,结构体成员可以是指向结构体的指针。,struct date int month; int day; int year; ; struct student int num; char name20; stru

14、ct date birthday; struct student *ps; ;,#include main( ) struct student s1, s2; s1.num = 201101; s2.ps = /201101,22,嵌套结构体变量的使用,若成员本身又属于一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。,main( ) struct student s, *p = /2000 12 21,23,结构体数组,结构体与数组可以相互嵌套:结构成员可以是数组;结构体可以构成数组,即结构体数组。 当要处理二维表格形式的数据(如学生基本信息表、通讯录)时,可利用结构体数组进行描述。

15、,struct student int num; char name20; char sex; int age; char addr30; st100;,24,结构体数组的初始化,与普通数组的初始化方法类似。,struct man char name20; int age; person4 = li,18,wang,19,zhang,20,sun,22;,main( ) struct man p4; int i; for (i = 0; i 4; i+) scanf(%s %d, , ,定义时初始化,执行时初始化,25,结构体数组的使用,访问结构体数组中的具体元素,必须遵守数组使

16、用的规定按下标进行访问或按指针进行访问。 要访问结构体数组中某个具体元素下的成员,又要遵守有关访问结构成员的规定。,main( ) struct man *p, *q; int i, m = 0; p = person; /p指向结构体数组首元素 for (i = 0; i age) q = p; m = q-age; printf(%s, %d, q-name, q-age); ,找到年龄最大的人,26,#include struct student int num; int age; ; main( ) struct student st3=1000,20,2000,19,3000,23;

17、 struct student *p; p = st; /p指向结构体数组首元素 printf(%dn, (*p+).num); /改成(*+p).num? 2000 /或printf(%dn, p+-num); /改成+p-num? 1001 /1000,阅读程序,27,结构体变量的成员做为函数参数,在函数中传递结构体变量的成员的方法与传递简单变量的方法相同。可以传递成员的值;可以传递成员的地址。,#include struct student int num; char name20; double score3; ; void display(int num, char *name) p

18、rintf(%d %sn, num, name); main( ) struct student st=20701, lili, 67.5, 88, 79.6; display(st.num, ); ,28,结构体变量做为函数参数,#include struct student int num; char name20; double score3; ; void display(struct student s) printf(%d %s %5.1f %5.1f %5.1fn, s.num, , s.score0, s.score1, s.score2); main

19、( ) struct student st=20701, lili, 67.5, 88, 79.6; display(st); ,值传递,29,结构体指针变量做为函数参数,#include struct student int num; char name20; double score3; ; void display(struct student *p) printf(%d %s %5.1f %5.1f %5.1fn, p-num, p-name, p-score0, p-score1, p-score2); main( ) struct student st=20701, lili, 6

20、7.5, 88, 79.6; display( ,地址传递,30,结构体数组做为函数参数,#include struct student int num; char name20; ; void display(struct student *s) struct student *p = s; for (p = s; p - s num, p-name); main( ) struct student st3=20701,lili,20702,wu,20703,su; display(st); ,地址传递,31,结构体变量做为函数返回值,#include struct student int

21、num; char name20; double score3; ; struct student input( ) struct student s; scanf(%d %s %lf %lf %lf, ,不能指定精度,后面不能加n,32,结构体变量的存储空间,结构体类型的变量所占居内存的大小是各成员所需内存量的总和。,struct data int i; float f; char c; ; struct data a;,i,f,c,例:变量a在内存所占字节数是 30 。 struct stud char num6; float s4; double ave; a, *p, s3;,33,共

22、用体,共用体又称为联合。共用体形式上类似于结构体。 共用体的成员共同占用同一段内存。 共用体类型的变量所占内存长度等于最长的成员的长度。,union data int i; float f; char c; ;,i,f,c,例:变量d在内存所占字节数是 12 。 union stud short int num; char name8; float score3; double ave; *p, d, stu3;,34,共用体类型的定义,共用体的定义方法与结构体基本类似。 定义共用体类型时,要指定共用体的类型名(遵循标识符命名规则);并说明组成该共用体的成员(成员名命名规则遵循标识符命名规则)

23、,以及每个成员的数据类型。,union 共用体类型名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ;,35,共用体变量的定义多种定义方法,union data int i; float f; char c; ; union data a, b;,union data int i; float f; char c; a, b;,union int i; float f; char c; a, b;,先定义类型, 再定义变量,定义类型时, 同时定义变量,直接定义变量,无名共用体,36,共用体变量的初始化,定义共用体变量时只能对第一个成员初始化。,#include union

24、data int i; float f; char c; a 100; /只能写一个数据,大括号不能省略 main( ) a = 100; /错,不能对共用体变量名赋值 printf(%dn, a.i); ,37,共用体变量的使用成员访问方法,共用体的使用方法与结构体基本相同。 访问成员时,可以使用圆点运算符和箭头运算符。,#include union data int i; float f; char c; a, *p;,main( ) p = /20 ,printf(%dn, a); /错误,不能只通过引用共用体变量名来得到成员的值,38,共用体变量的使用后存放后有效原则,共用体变量的地址

25、和它的各成员的地址都是同一地址;每一瞬时只有一个成员起作用; 共用体变量中的有效值是最后一次存放的成员的数值。,#include union data int i; float f; char c; a; main( ) a.i = 10; a.f = 20.0; a.c = a; printf(%fn, a.f); /错! printf(%dn, a.c); /97 ,#include main( ) union u char *name; int age; int income; s; =WANGLING; s.age=28; s.income=1000; printf(%dn

26、, s.age); /1000,39,共用体变量的使用读取时可使用不同成员,但意义不同,#include union data short int i; char c2; a;,main( ) char t; a.i = 258; printf(hi:%d, lo:%dn, a.c1, a.c0); t = a.c0; a.c0 = a.c1; a.c1 = t; /交换两个字节 printf(hi:%d, lo:%dn, a.c1, a.c0); printf(i=%dn, a.i); /513 ,40,共用体变量的使用同类型共用体变量可相互赋值,两个类型相同的共用体变量,可以互相赋值。,#

27、include union data int i; float f; char c; a, b;,main( ) a.i = 10; a.f = 20.0; a.c = a; b = a; printf(%dn, b.c); /97 ,41,共用体变量的使用嵌套,共用体、结构体、数组可相互嵌套。,union result short int point; char grade10; ; struct student int num; char name20; union result r; ;,#include main( ) struct student s30, *p; p = s; p-

28、r.point = 90; printf(%dn, p-r.point); / 90,42,共用体变量的使用共用体变量与函数,共用体变量以及共用体变量指针都可以做为函数参数、函数返回值。与结构体类似。,#include union data int i; float f; char c; ;,void display(union data x) printf(%dn, x.i); main( ) union data d; d.i = 100; display(d); ,43,枚举,若一个变量只有几种可能的值,可以定义为枚举类型。 所谓“枚举”是指将变量的可能取值一一列举出来,变量的值只限于列举出来的值的范围。与数学上的定义域类似。 例如,要

温馨提示

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

最新文档

评论

0/150

提交评论