1、结构类型的定义用关键字struct引导,其基本形式如下q结构类型名称由用户自己定义,该名称和struct关键字共同构成了结构类型的描述;中包围的是组成该结构的成员描述序列,成员的数量可以是一个也可以是多个。每个成员描述的形式与变量定义一样,需要给出成员变量的类型和名字,并用分号结束。多个成员的描述信息是平行的,顺序可以调换,使用时依据成员名字确定对应关系。struct 结构类型名称 成员列表;高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础5结构类型定义q前面提到的学生信息就可以采用如下方式定义为一个结构类型:q自定义的结构类型和系统提供的标准数据类型(如int、char、f
2、loat、double)一样,都可以用来定义变量,只是对于结构类型需要先由用户完成类型的定义,才能定义对应的结构类型的变量。q有了上面结构类型定义的描述,就可以定义对应的结构变量了,如:struct _StuInfo stu1,stu2;q就定义了两个_StuInfo结构类型的变量,“struct _StuInfo”为新定义的结构类型的关键字,对应变量的名字为stu1和stu2。struct _StuInfo char name10;int age;char addr50;char phone20;高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础6结构类型定义q上述结构变量的
3、声明也可在结构类型定义的同时完成,描述为:qC语言中还支持通过typedef关键字,为用户自定义的结构类型取一个别名,以方便在程序中使用。如上面的结构类型定义可改写为右图q程序中需要定义此结构类型的变量时,可以使用STUINFO代替原来的struct _StuInfo:STUINFO stu1,stu2;等价于 struct _StuInfo stu1,stu2;q上述两条语句都声明了两个结构变量。为了与其他变量类型关键字和对象名字区分,本书中自定义结构类型的名字均采用大写字母表示。stu1,stu2;typedef struct char name10;STUINFO;高职学院高职学院 计算
4、机教研室计算机教研室程序设计基础程序设计基础7结构类型定义qtypedef关键字不仅可以给自定义的结构类型取别名,也可以对已有的标准数据类型起别名,如:typedef int INTEGER;typedef float REAL;q在具有上述typedef语句的程序中,下列语句就是等价的:int i,j;等价于 INTEGER i,j;float pai;等价于 REAL pai;q结构类型的成员可以是任何类型的变量,也可以是结构类型。对于前面磁盘文件信息就可以定义为:typedef struct int month;int day;int year;MYDATE;typedef struct
5、 char file_name50;int size;MYDATE create_time;MYFILE;高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础8结构变量的初始化q结构类型的定义一般书写在程序的开头,放在所有函数(包括main函数)的定义之前,以便本文件中所有的函数都能使用它来定义变量。当然也可以在具体函数定义中定义结构类型,仅供本函数体内使用。q结构类型的定义语句并不会产生内存分配,仅是对结构类型构成的说明,只有在定义相应的结构变量时才分配内存空间。结构变量的定义可以出现在任何可以定义普通变量的地方,同样遵守变量先定义后使用的原则。q与简单变量和数组一样,定义结构
6、变量的同时也可以直接进行初始化。对结构变量的初始化就是为结构变量的成员提供初值,形式上与数组的初始化相似。下面结构变量的定义包含了相应的初始化描述:STUINFO stu1=“Zhang”,21,“Beijing,china”,“01012345678”;q定义了STUINFO类型的变量stu1,初始化后的stu1变量在内存中可表示为:q这种对结构变量各个成员整体赋值的形式只能出现在结构变量定义时的初始化操作,而不能用于对已经定义了的结构变量赋值。stu1Zhang21Beijing,china01012345678nameageaddrphone高职学院高职学院 计算机教研室计算机教研室程序
7、设计基础程序设计基础9结构变量的使用q程序中对结构变量的操作主要有两种情况:操作整个结构变量和对结构变量的成员变量的访问。对于整个结构变量的操作通常仅限于同类型的结构变量之间进行整体赋值,从而得到结构变量值的新的副本,如下面语句:STUINFO stu1=“Li”,20,“Shanghai,china”,“020156545678”,stu2;stu2=stu1;q程序中对结构变量的使用更多是对其成员变量的访问,包括对结构变量的输入输出、存取等操作,都是通过操作结构变量的成员实现。C语言提供了圆点运算符(.)来实现对结构变量成员的访问,具体访问方式是在结构变量名的后面加上一个圆点,再加上成员变
8、量的名称。对于结构变量的成员变量,可以像同类型的普通变量一样进行使用,对其进行赋值和读取。q如果初始化时把Zhang同学的年龄和电话号码录入错误,可以通过如下语句对其进行修正:stu1.age=19;strcpy(stu1.phone,“01078675645”);高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础10结构变量的使用q也可以使用printf语句对stu1变量的各个成员变量的值进行输出:printf(“stu1.name is:%sn”,stu1.name);printf(“stu1.age is:%dn”,stu1.age);printf(“stu1.addr
9、is:%sn”,stu1.addr);printf(“stu1.phone is:%sn”,stu1.phone);q需要注意格式控制符与成员变量类型的匹配,不能使用printf语句对结构变量进行整体输出,下面写法是错误的:printf(“%s%d%s%sn”,stu1);q如果成员变量依然是结构类型,则需要再次通过圆点运算符去访问其成员,直到成员变量为普通数据类型。例如:MYFILE fp=“C Programming”,10240,3,14,2014;printf(“The file%s is created at%d-%d-%dn”,fp.name,fp.create_time.year
10、,fp.create_time.month,fp.create_time.day);q结构变量成员可以和其他普通变量具有相同的名字,但不会引起混淆。因为,结构变量的成员变量不是单独存在的,也不能直接使用,必须和结构变量的名字一起使用才表示其为具体某个结构变量的成员变量,而不是普通变量。高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础11结构变量示例q例例8-1 编写程序,计算两点间的直线距离并输出。q分析:数学中我们知道,一个点可以用两个坐标来表示(x,y),其中x表示水平坐标,y为垂直坐标。若两点坐标分别为(x1,y1)和(x2,y2),则两点间的直线距离可以用如下公式表示
11、:x=x1-x2,y=y1 y2;距离d=。q为了更好的在程序中表示一个点,可将其定义为一个结构类型,由x坐标和y坐标两个成员表示,如:typedef structdouble x;double y;#include#include typedef structdouble x;POINT;int main()POINT point1,point2;double x,y,result;printf(Enter point1 coordinate:);scanf(%lf%lf,&(point1.x),&(point1.y);printf(Enter point2 coordinate:(poin
12、t2.x),&(point2.y);x=point1.x-point2.x;y=point1.y-point2.y;result=sqrt(x*x+y*y);printf(The distance about(%.2f,%.2f)and(%.2f,%.2f)is:%.2fn,point1.x,point1.y,point2.x,point2.y,result);return 0;高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础12结构变量的存储 q结构变量在内存中采用连续的内存空间依次存储所有成员变量,正常情况下单个结构变量所占用的内存空间应该是其所有成员所占存储空间的总和。
13、如前面定义过的结构类型STUINFO q对应的结构变量成员中有3个char型数组,长度分别为10、50和20,1个整型变量,其成员正常占用的存储空间大小应为:(10+50+20)*1+1*4=84q可通过sizeof()运算符来检查这种类型的结构变量实际占用存储空间的大小。结果sizeof获得的结果(88)与理论上的计算结果84有4个字节上的差异,即实际存储时多用了4个字节。具体原因参考教材,略typedef struct char name10;高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础13结构数组 q结构里可以包含数组成员,同时也可以定义以结构作为元素的数组。结构数组的定义与普通元素构成的数组相似,使用时需要遵守结构变量及其成员的运算
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1