·52 C程序设计要点分析与题解 第6章结构与联合 6.1结构的定义 1.结构的定义及其一般格式 数组是将同举刑元素组成单个罗辑整体的一种新据类型而结构则是将不同类刑元素组成 单个逻辑整体的一种数据类型。结构是C语言中一种强有力的数据类型, 是很重要的概念之 例如,日期由年、月、日构成: int year: int month: struct date int month: int day: int year 这样,就可把年、月、日当作一个整体处理。年、月、日是该结构的成员。结构的成员 也可以是不同数据类型的变量,例如: char name [30]: float salary: 上面定义了两个结构数据类型,date和age。可用这些已定义的结构类型来说明一组具 体结构类型变量。例如: struct date today,tomorraw: /体定义了两个结构类型变量today,tomorraw*/ struct wage workerl,worker2,worker3:/*定义了三个结构类型变量*/ 结构定义的一般格式为: struct[结构类型名] 类型说明符成员变量名 类型说明符成员变量名: 】[结构变量列表]:
·52· C 程序设计要点分析与题解 第 6 章 结构与联合 6.1 结构的定义 1.结构的定义及其一般格式 数组是将同类型元素组成单个逻辑整体的一种数据类型。而结构则是将不同类型元素组成 单个逻辑整体的一种数据类型。结构是 C 语言中一种强有力的数据类型, 是很重要的概念之 一。 例如,日期由年、月、日构成: int year; int month; int day; 上述表示方法不能看出它们是彼有关系的三个量。可以采用下面的定义表示: struct date { int month; int day; int year; }; 这样,就可把年、月、日当作一个整体处理。年、月、日是该结构的成员。结构的成员 也可以是不同数据类型的变量,例如: struct wage { char name[30]; float salary; }; 上面定义了两个结构数据类型,date 和 wage。可用这些已定义的结构类型来说明一组具 体结构类型变量。例如: struct date today,tomorraw; /*定义了两个结构类型变量 today,tomorraw*/ struct wage worker1,worker2,worker3;/*定义了三个结构类型变量*/ 结构定义的一般格式为: struct[结构类型名] { 类型说明符 成员变量名; . 类型说明符 成员变量名; }[结构变量列表];
第6章结构与联合 ·53· 结构变量列表是指以逗号分隔开的若干结构类型变量,例如: struct date int month: int day: int year: }today: 或 struct int month: int day: int year: }today: struct date /定义了一种结构类型*/ int year: struct date today:/*说明了一个具体的结构变量*/ 这三种说明结构类型变量的方式都可以使用,第三种写法的风格较好 2.结构的存取 结构变量成员可作为单独变量来操作,也就是说,可以直接访问结构中的一个成员变量, 其格式为: 结构变量名。成员变量名 例61:显示输入的年、月、日 #include <stdio.h> main() struct date /*定义了结构类型*/ int montha int day: int year: struct date today: /*结构体变量today*/
第 6 章 结构与联合 ·53· 结构变量列表是指以逗号分隔开的若干结构类型变量,例如: struct date { int month; int day; int year; }today; 或 struct { int month; int day; int year; }today; 或 struct date /* 定义了一种结构类型 */ { int month; int day; int year; }; struct date today;/* 说明了一个具体的结构变量 */ 这三种说明结构类型变量的方式都可以使用,第三种写法的风格较好。 2.结构的存取 结构变量成员可作为单独变量来操作,也就是说,可以直接访问结构中的一个成员变量, 其格式为: 结构变量名.成员变量名 例 6.1: 显示输入的年、月、日 #include <stdio.h> main() { struct date /* 定义了结构类型 */ { int month; int day; int year; }; struct date today; /* 结构体变量 today */
·54· C程序设计要点分析与题解 printf("Enter today's date(年,月,日)n"): scanf("dd&today.year,&today.month,&today.day) printf("Today's date is/dn",today.year,today.month, today.day 执行后可以显示出所输入的今天的年、月、日。 例6.2:对外部存储类型的结构体变量的初始化。 /10-1*/ struct student /定义结构类型 long int num char name[20]; char sex. char addr[20]: )a=(89031,"Li Lin",M,"123 Beijing Road"); /*结构体变量赋初值*/ main fprintf("No.%1d\nname:%s\nsex:%c\naddress:%s\n".a.num.a.name. a.sex,a.addr): 例6.3:对静态存储类型的结构体变量的初始化。 Main ( static struct student /静态结构类型 {long int num char name[20] char sex; char addr[20]; )a=(89031,"Li Lin",'M,"123 Beijing Road") /*赋初值*/ printf("No.%1d\nname:%s\nsex:%c\naddress:%s\n".a.num.a.name a.sex,a.addr); 1 6.2结构数组 不仅结构变量成员可以是数组,而且,同一类结构变量的集合还可构成结构数组,例如: struct wage char name [30] float salary: 1: static wage persons [100]:
·54· C 程序设计要点分析与题解 printf(″Enter today′s date(年,月,日)\n″); scanf(″%d,%d,%d″,&today.year,&today.month,&today.day); printf(″Today′s date is %d/%d%/d\n″,today.year, today.month, today.day ) } 执行后可以显示出所输入的今天的年、月、日。 例 6.2:对外部存储类型的结构体变量的初始化。 /*L10-1*/ struct student /* 定义结构类型 */ { long int num; char name[20]; char sex; char addr[20]; }a={89031,”Li Lin”,’M’,”123 Beijing Road”}; /*结构体变量赋初值*/ main () {printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name, a.sex,a.addr); } 例 6.3: 对静态存储类型的结构体变量的初始化。 Main () { static struct student /* 静态结构类型 */ {long int num; char name[20]; char sex; char addr[20]; }a={89031,”Li Lin”,’M’,”123 Beijing Road”}; /*赋初值*/ printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name, a.sex,a.addr); } 6.2 结构数组 不仅结构变量成员可以是数组,而且,同一类结构变量的集合还可构成结构数组,例如: struct wage { char name[30]; float salary; }; static wage persons[100];
第6章结构与联合 ·55· 这就说明了100个结构变量所组成的数组。 例6.4:输入后选人名,对后选人投票计数,统计输出每个人的得票结果 Struct person /体全局结构类型*/ (char name [20] int count: J1 eader[3]=Li”,0,"Zhang”,0,"fun“,0 /*初始化*/ in0 (int I,j; char leader name [20] for(1=1:I<e10:I+) {scanf(%s",leader_name): /*输入人名* for(j=0:j<3:j++) if (strcmp(leader_name,leader[j].name) ==0 leader[j].count++; /*紫加票数*/ printf(\n") s:%dn”,leader[I.name,leader[I.count):/*每人得票数*/ 6.3结构与函数 L.向函数传递结构变量成员 结构变量成员可作为参数传递给函数。例如有一结构为: struct fred char x: int y: float z: char s [10] lmike: 其中各个成员均可作为函数的参数,例如: funcO(mike.x) /字符型参数* func1(mike.y) /整数型参数为 func2 (mike.z): /浮点型参数* func3(mike.s): /字符型数组参数*/ func4(mike.s [2]) /字符型参数*/ 2.向函数传递完整的结构
第 6 章 结构与联合 ·55· 这就说明了 100 个结构变量所组成的数组。 例 6.4:输入后选人名,对后选人投票计数,统计输出每个人的得票结果。 Struct person /* 全局结构类型 */ {char name[20]; int count; }leader[3]={“Li”,0,”Zhang”,0,”Fun”,0}; /*初始化*/ main () {int I,j; char leader_name[20]; for (I=1;I<=10;I++) {scanf(“%s”,leader_name); /*输入人名*/ for (j=0;j<3;j++) if (strcmp(leader_name,leader[j].name)==0) leader[j].count++; /*累加票数*/ } printf(“\n”); for (I=0;I<3;I++) printf(“%5s:%d\n”,leader[I].name,leader[I].count);/* 每人得票数*/ } 6.3 结构与函数 1.向函数传递结构变量成员 结构变量成员可作为参数传递给函数。例如有一结构为: struct fred { char x; int y; float z; char s[10]; }mike; 其中各个成员均可作为函数的参数,例如: func0(mike.x); /*字符型参数*/ func1(mike.y); /*整数型参数*/ func2(mike.z); /*浮点型参数*/ func3(mike.s); /*字符型数组参数*/ func4(mike.s[2]); /*字符型参数*/ 2.向函数传递完整的结构
·56· C程序设计要点分析与题解 不仅结构元素可作为参数传递给函数,整个结构也可作为参数传递的函数。完整结构向 函数传递的操作中,应注意: 整个结构按传值方式传 。和普通变量一样,与数组不同,在函数内所引起结构参数中 某个值的变化,只影响函数调用时所产生的结构拷贝,不影响原来的结构。 (②)结构分全局定义和局部定义,定义在所有函数外部的结构称为全局结构,定义在函数内 部的结构称为局部结构。它们被引用的范围不同。 例6.5:局部定义的结构 main( struct /*局部定义*/ int a,b: char cha arg: arg.a=1000: fl(arg): printf("a=%d\n",arg.a): fl(parm) struct /*形参说明定义* int x,y: char ch: }parm: /函数体* printf ("xl=%d\n",parm.x) Darm.x=20: printf("x2=%d\n",parm.x): eturn: 执行结果: x1=1000 ¥2=20 a=1000 例6.6:全局定义的结构 struct st /全局定义*/ int a.b:
·56· C 程序设计要点分析与题解 不仅结构元素可作为参数传递给函数,整个结构也可作为参数传递的函数。完整结构向 函数传递的操作中,应注意: (1)整个结构按传值方式传递。和普通变量一样,与数组不同,在函数内所引起结构参数中 某个值的变化,只影响函数调用时所产生的结构拷贝,不影响原来的结构。 (2)结构分全局定义和局部定义,定义在所有函数外部的结构称为全局结构,定义在函数内 部的结构称为局部结构。它们被引用的范围不同。 例 6.5:局部定义的结构 main() { struct /*局部定义*/ { int a,b; char ch; }arg; arg.a=1000; fl(arg); printf(″a=%d\n″,arg.a); } fl(parm) struct /*形参说明定义*/ { int x,y; char ch; }parm; { /*函数体*/ printf(″x1=%d\n″,parm.x); parm.x=20; printf(″x2=%d\n″,parm.x); return; } 执行结果: x1=1000 x2=20 a=1000 例 6.6:全局定义的结构 struct st /*全局定义*/ { int a,b;