c语言程序设计(王勇)第14章结构体共用体和用户定义类型-海贝.ppt
第 14 章 结构体与共用体和用户定义类型,第 一 节 用户定义类型,用户自定义类型功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c;REAL f1,f2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不同,第 14 章 结构体与共用体和用户定义类型,第 一 节 用户定义类型,第二节 结构体类型,概述:结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;,成员类型可以是基本型或构造型,struct 是关键字,不能省略,合法标识符可省:无名结构体,一、结构体类型定义(说明),例 struct student short num;char name20;char sex;short age;float score;char addr30;,结构体类型定义描述结构的组织形式,不分配内存,二、结构体变量的定义,1.先定义结构体类型,再定义结构体变量,struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,#define STU struct studentSTU int num;char name20;char sex;int age;float score;char addr30;STU stu1,stu2;,2.定义结构体类型的同时定义结构体变量,struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,3.直接定义结构体变量,struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义变量只能一次,struct 类型标识符 成员名;类型标识符 成员名;.变量名表列;,4.先用typedef说明一个结构体类型名,再用新类型名来定义变量,typedef struct char name12;char sex;struct date birthday;float sc4;STREC;STREC std,pers3,*pstd,struct date int year;int mouth;int day;,说明:,1.结构体类型与结构体变量概念不同,结构体类型 结构体变量不分配内存;分配内存不能赋值、存取、运算;可以,2.结构体成员名与程序中变量名可相同,不会混淆,3.结构体可嵌套,三、结构体变量的初始化,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;struct student stu1=112,“Wang Lin”,M,19;,初始化时不允许跳过前面的成员给后面的成员赋值,但可以只给前面的成员赋值,后面未赋值的数值数据按0处理,字符数据按0,字符串数据按空串处理。,四、结构体变量的引用,2.可以将一个结构体变量赋值给另一个结构体变量,引用方式:(1)结构体变量名.成员名(2)指针变量名-成员名(3)(*ps).sex,说明:1.不能整体引用,只能引用变量成员,3.结构体嵌套时逐级引用,不能写成*ps.sex,因.运算符的级别高,五、结构体数组,struct student int num;char name20;char sex;int age;struct student stu2;,结构体数组初始化,例 struct int num;char name20;char sex;int age;stu=,;,顺序初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;,例 struct student int num;char name20;char sex;int age;stu=,;,结构体数组引用,引用方式:结构体数组名下标.成员名,例,#include stdio.hmain()struct stu int i;char c;float f;x=50,A,3.25,*ps;ps=,六、函数之间结构体变理的数据传递,1.向函数传递结构体变量的成员(值传递),2.向函数传递整个的结构体变量(值传递),(1)通过实参向函数中的形参传递数据时,所传递的是各个成员的值。(2)使用结构体传递数据影响程序执行效率(3)形参中各个成员的变化不会影响到实参,3.向函数传递结构体变量的地址,(1)形参应该是类型相同的结构体类型指针,(2)系统只需开辟一个单元用于存放变量地址,举例:,typedef struct int a;char b;ST;ST fun(ST x)x.a=99;x.b=S;return x;main()ST y;y.a=0;y.b=A;printf(n y.a=%d,y.b=%c,y.a,y.b);y=fun(y);printf(n y.a=%d,y.b=%c,y.a,y.b);,运行结果:y.a=0,y.b=A y.a=99 y.b=S,七、利用结构体变量构成链表,&c,&b,结点,若有下列格式的结构体,struct linklong num;float cj;struct link*p;stu a,b,c;,&c,&b,&a,链表的概念:,若干个结点按一定的原则连接起来形成的链。,链表的连接原则:,(1)前一个结点“指向下一个结点,通过前一个 结点才能找到下一个结点;,(2)第一个结点的设置:设置一个“头指针”,使它指向第一个结点;,(3)最后一个结点的设置:为避免数据写入错误,应不指向有用地址,通常指向零地址(NULL),链表中各结点在内存中并不是占连续的一片内存单元。,struct student int num;float cj;stuct student*next;st1,st2,st3,*head;,main()st1.num=89101;st1.cj=89.5;st2.num=89102;st2.cj=90;st3.num=89103;st3.cj=94;head=,&st3,&st2,&st1,NULL,NULL,94,89108,4048,90,89105,4016,89.5,89102,3028,4048,4016,删除一个结点的过程,4048,sancu()st1.next=st2.next;,st1 st2 st3,增加一个结点的过程,4016,8079,为此需要设置两个指针,一个指向查找的结点,一个指向其前一个结点。通过 p2=p1,p1=p1-next向后移动指针,例:顺序输出单向链表各结点数据域中的内容,void print_slist(SLIST*head)SLIST*p;p=head-next;if(p=0)printf(“Linklist is null!);else printf(“head”);do printf(“-%d”,p-data);p=p-next;while(p!=0);printf(“-endn”);,第三节 共用体(联合体),union 共用体名 类型标识符 成员名;类型标识符 成员名;.;,例 union data short i;char ch;float f;,类型定义不分配内存,特征:使几个不同类型的变量共占一段内存(相互覆盖),定义形式:,形式一:union data short i;char ch;float f;a,b;,形式二:union data short i;char ch;float f;union data a,b,c,*p,d3;,形式三:union short i;char ch;float f;a,b,c;,共用体变量的定义,共用体变量定义分配内存,长度=最长成员所占字节数,共用体变量任何时刻只有一个成员存在,共用体变量引用,例 a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对),引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例 union int i;char ch;float f;a;a=1;(),不能在定义共用体变量时初始化,例 union int i;char ch;float f;a=1,a,1.5;(),可以用一个共用体变量为另一个变量赋值,例 float x;union int i;char ch;float f;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;(),例 将一个整数按字节输出,运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a,main()union int_char short int i;char ch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);,结构体与共用体区别:存储方式不同,联系:两者可相互嵌套,补 枚举类型数据,一、枚举类型数据的概念,所谓枚举型数据类型是指这种类型只能是所定义的若干个名字之一。,例:enum color red,yellow,white=10,black;enum color x,y;x=yellow;/*正确*/x=blue;/*错误*/,二、说明,1.花括号中的一些名字是程序设计者自己指定的,命名规则与标识符相同。这些名字无固定的含义,只是一个符号。不是变量,不能进行赋值。red=3;/*是错误的*/,2.可以在定义类型时给枚举常量初始化(例上面的 white=10),3.花括号中的符号是有值的,其值是其所处的位置。各名字分别代表 0,1,2,3,4,例:red yellow white black 0 1 2 3,4.玫举常量可以比较,其大小由其所处的位置决定。,例:if(color=red)printf(“red”);if(color!=black)printf(“not black”);if(color white)printf(“it is black”);,5.枚举变量的值只能是枚举常量之一,可以将枚举常量赋给一个枚举变量.但不能将一个整数赋给它.,Color=black;/*正确*/Color=2;/*错误*/,6.枚举常量不是字符串,不能用%s输出。,7.枚举变量可作为循环变量。color+表示按顺序变化。,