结构体联合体枚举_第1页
结构体联合体枚举_第2页
结构体联合体枚举_第3页
结构体联合体枚举_第4页
结构体联合体枚举_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

结构体数据类型C数据类型基本类型构造类型指针类型空类型整型浮点型字符型枚举类型单精度浮点型双精度浮点型数组类型结构体类型联合体类型结构体类型的定义结构体类型定义的一般形式为:struct结构体名{类型名1成员名1;……类型名n成员名n;};struct是结构体类型的标志。结构体名是由用户定义的标识符,它规定了所定义的结构体类型的名称。结构体类型的组成成分称为成员,成员名的命名规那么与变量名相同。结构体类型的定义结构体类型定义形式例如:structperson{charname[20];charsex;intage;floatheight;};表示定义了一个结构体类型——structperson,它由name、sex、age和height四个成员组成。练习:定义一个结构体类型structstudent,要求包含学生姓名、学号、数学成绩、英语成绩、计算机成绩、总分、邮政编码、通讯地址。结构体类型的定义在结构体类型定义中要注意以下几点:结构体类型定义中可以包含另外的结构体,即结构体是可以嵌套的。例如:structdate{ intyear;intmonth;intday;};structperson{charname[20];charsex;

structdatebirthday;floatheight;};结构体类型变量一、结构体变量的定义定义结构体类型,只是说明了该类型的组成情况,编译系统并没有给它分配内存空间,就象系统不为int等类型本身分配空间一样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。结构体类型变量一、结构体变量的定义1. 先定义结构体类型,再定义变量。例如:

structperson {charname[20]; charsex; intage; floatheight; };

structperson

per;表示先定义了结构体类型structperson,然后定义了一个structperson类型的结构体变量per。结构体类型变量一、结构体变量的定义结构体变量占用的内存空间是其成员所占内存之和,因此per占用的内存空间为20+1+4+4=27个字节。结构体变量中的各成员在内存中按定义的顺序依次排列。注意:定义变量时,structperson必须在一起使用,它的用法与int、char等类型名的用法相同。成员名所占空间〔字节数〕nameheightagesex20144结构体类型变量二、结构体变量的引用〔1〕对结构体变量中成员的引用引用的一般形式为: 结构体变量名.成员名结构体类型变量〔1〕对结构体变量中成员的引用#include<stdio.h>structperson{charname[20];charsex;structdata{intyear;intmonth;intday;};floatheight;};voidmain(){personper;databirthday;printf("Enterthename:");gets();per.sex=’M’;per.birthday.year=1982;per.birthday.year++;per.birthday.month=12;per.birthday.day=15;per.height=(175+176)/2;printf("%s%3c%4d/%2d/%d%7.1f\n",,per.sex,per.birthday.month,per.birthday.day,per.birthday.year,per.height);}结构体数组一、结构体数组的定义定义结构体数组的方法和定义结构体变量的方法一样,只是必须说明其为数组。例如: structperson {charname[20];charsex;intage;floatheight;};structpersonper[3];成员名sexnameageheightsexnameageheightsexnameageheight数组元素per[0]per[1]per[2]结构体数组一、结构体数组的定义定义结构体变量的三种方法都可以用来定义结构体数组。例如:structperson{charname[20];charsex;intage;floatheight;}per[3];struct{charname[20];charsex;intage;floatheight;}per[3];结构体数组二、结构体数组的初始化和一般数组一样,结构体数组也可以进行初始化。structperson{charname[20];charsex;intage;floatheight;}per[3]={{"LiPing",’M’,20,175},{"WangLing",’W’,19,162.5},{"ZhaoHui",’M’,20,178}};数组每个元素的初值都放在一对大括号中,括号中依次排列元素各成员的初始值。与一般数组的初始化一样,如果给出了全部元素的初值,那么数组的长度可以不指定,由系统根据初值的数目来确定数组长度。结构体数组三、结构体数组的引用对结构体数组的引用一般是对数组元素的成员进行引用。引用只要遵循对数组元素的引用规那么和对结构体变量成员的引用规那么即可。程序功能:输出结构体数组各元素的成员值voidmain(){structperson{ charname[20]; charsex; intage; floatheight;}per[3]={{"LiPing",’M’,20,175},{"WangLing",’F’,19,162.5},{"ZhaoHui",’M’,20,178}};inti;for(i=0;i<3;i++)printf("%–18s%3c%4d%7.1f\n〞,per[i].name,per[i].sex,per[i].age,per[i].height);}作业

定义一种类型stu可以放学生的姓名、学号、英语成绩,其中英语成绩按照百分制给的成绩。要求输入3个人的信息,然后按英语成绩由高到低输出这3个人的信息。结构体指针变量指向结构体变量的指针也称为结构体指针,它保存了结构体变量的存储首地址。1.结构体指针的定义形式:

struct

结构体类型名*指针变量名;structstudentstu,*p;p=&stu;2.结构体变量成员的三种访问方法〔1〕结构体变量.成员名stu.ID〔2〕(*结构体指针).成员名(*p).ID〔3〕结构体指针->成员名p->ID结构体指针运算符“->〞结构体指针->结构体成员structperson{charname[10];intage;}; structperson*p,s,boy[3]={〞Zhang〞, 18,〞Wang〞,20,〞Li〞,17};p=boy; 对于已定义的结构体数组,假设用一个变量来存放该结构体数组在内存中的首地址,那么该变量为指向结构体数组的指针变量。例如,定义结构体类型person和结构体指针变量p。定义了结构体数组boy和结构体指针变量p,且p指向数组boy的首地址。结构体变量的首地址就是其指针,用取地址符&得到指向结构体变量的指针变量称为结构变量的指针变量指向结构体变量的指针在使用时同样必须要先定义,再赋值,然后才可以使用如果有指针p指向结构变量a,那么a.math等价于(*p).math等价于p->math使用指向结构数组的指针变量引用结构数组成员时,同指针指向数组时是类似的要明确指针当前指向的数组元素,同时要考虑结构体成员的引用方法联合体一、联合体类型及其变量的定义联合体类型定义的一般形式为:union联合体名{类型名1成员名1;……类型名n成员名n;};union是联合体类型的标志。联合体名是由用户定义的标识符,它规定了所定义的联合体类型的名称。联合体类型也由假设干成员组成。联合体一、联合体类型及其变量的定义

unionscore {chargrade; floatpoint; };表示定义了一个联合体类型unionscore,它由grade和point两个成员组成联合体一、联合体类型及其变量的定义1. 先定义联合体类型,再定义变量。例如:unionscore{chargrade;floatpoint;};unionscores;2.定义类型的同时定义变量。:unionscore{chargrade;floatpoint;}s;3.直接定义联合体类型变量。union{chargrade;floatpoint;}s;联合体一、联合体类型及其变量的定义联合体类型及其变量的定义在形式上与结构体很类似。但它们的含义是不同的。结构体变量的每个成员分别占有独立的内存区域,因此结构体变量所占的内存字节数是其成员所占内存字节数之和。而联合体变量的所有成员共同占用一段内存区域,所以联合体变量所占字节数是其成员中占内存空间最大的成员的字节数。gradepoint图12.3联合体二、联合体变量的引用联合体变量也必须先定义,后使用。不能直接引用联合体变量,只能引用联合体变量的成员。引用的一般形式为:

联合体变量名.成员名联合体变量的每个成员也可以像普通变量一样进行其类型允许的各种操作。注意:由于联合体类型采用的是覆盖技术,因此联合体变量中起作用的总是最后一次存放的成员变量的值。联合体二、联合体变量的引用程序功能:引用联合体变量的成员#include<stdio.h>voidmain(){uniontemp{chara;intb;}t;t.a=66;t.b=266;/*266=256+10即266的二进制为100001010,所以高字节放1、低字节放10*/printf("%x:%d,%x:%d\n",&t.a,t.a,&t.b,t.b);}变量t起始地址联合体xxxxxxxxxxxxxxxx成员变量a赋值前01000010xxxxxxxx成员变量a赋值后变量t起始地址01000010xxxxxxxx成员变量b赋值前变量t起始地址00001010

00000001成员变量b赋值后变量t起始地址联合体联合体变量可以作为结构体变量的成员,结构体变量也可以作为联合体变量的成员,并且联合体类型也可以定义数组。程序功能:联合体变量作为结构体变量的成员注意:不能对联合体变量进行初始化。不能将联合体变量作为函数参数和返回值。structstudent{char*name;intdept;

unionscore{chargrade;floatpoint;}s;}stu[2];枚举类型一、枚举类型及其变量的定义枚举类型定义的一般形式为:

enum枚举名{枚举元素1,枚举元素2,……};enum是枚举类型的标志。枚举名是由用户定义的标识符,它规定了所定义的枚举类型的名称,例如:

enumseason{spring,summer,autumn,winter};表示定义了一个枚举类型——enumseason,它包含四个枚举元素。枚举类型一、枚举类型及其变量的定义定义了枚举类型后,就可以用它定义枚举类型变量。枚举类型变量的定义有两种方法。1. 先定义枚举类型,再定义变量。例如:enumseason{spring,summer,autumn,winter};enumseasons;表示定义了一个enumseason枚举类型和属于该类型的变量s。2. 直接定义枚举变量。例如:enum{spring,summer,autumn,winter}s;枚举类型一、枚举类型及其变量的定义说明〔1〕枚举类型中的枚举元素是用户定义的标识符,对程序来说,这些标识符并不自动代表什么含义。例如,写成spring并不自动表示为“春季〞,写成spr也可以。〔2〕在C编译中,将枚举元素作为常量处理,称为枚举常量。因此不能对它们进行赋值。例如:spring=0;winter=1;是不合法的。枚举类型一、枚举类型及其变量的定义说明〔3〕枚举元素是被处理成一个整型常量的,它的值取决于定义时各枚举元素排列的先后顺序。第一个枚举元素的值为0,第二个为1,依次顺序加1。例如,在以上的定义中,spring的值为0,summer的值为1,autumn的值为2,winter的值那么为3。也可以在定义时改变枚举元素的值。例如:enum{spring=1,summer,autumn,winter=0}s;没有指定值的枚举元素,其值为前一元素值加1。因此,spring的值为1,summer的值为2,autumn的值为3,而winter的值为0。枚举类型二、枚举类型变量的根本操作1. 枚举变量的赋值只能给枚举变量赋枚举常量。不能直接给枚举变量赋整型值,但是可以通过将整型值强制类型转换成枚举类型赋值。程序功能:为枚举类型变量赋值voidmain(){enumseason{spring,summer,autumn,winter}s1,s2;s1=summer;s2=(enumseason)2;printf("s1=%d,s2=%d\n",s1,s2);}枚举类型二、枚举类型变量的根本操作2. 枚举元素的判断比较voidmain(){enumseason{spring=1,summer,autumn,winter}s;for(s=spring;s<=winter;s++)printf("%d",s);}枚举类型二、枚举类型变量的根本操作3. 枚举变量只能通过赋值语句得到值,不能通过输入语句直接输入数据。也不能使用输出语句直接输出枚举元素,可以通过switch语句将枚举元素以字符串形式输出。switch(s){ casespring:printf("spring\n");break;casesummer:printf("summer\n");break;caseautumn:printf("autumn\n");break;casewinter:printf("winter\n");break;}类型定义-typedef定义新类型名的一般形式是:

typedef类型名标识符使用typedef语句不是创造新类型,而是为已经存在的类型增加了一个名字。例如:structperson{charname[20];charsex;intage;};typedefstructpersonPERSON;PERSONper[3];用途: 可以增加程序的可读性/*-----------------------------程序功能:统计学生人数计算平均成绩----------------------------*/#include<stdio.h>voidmain(){structstudent{charname[20];charsex;intscore;};structstudentstu[5];inti,m_num=0,f_num=0;floataverage,sum=0;for(i=0;i<5;i++){printf

温馨提示

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

最新文档

评论

0/150

提交评论