一、 结构体变量的引用
在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则:
- 不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义studentl和 student2为结构体变量并且它们已有值。不能这样引用:
printf ("%d,%s,%c,%d,%f,%s\n",student1);
只能对结构体变量中的各个成员分别进行输入和输出。引用结构体变量中成员的方式为
结构体变量名.成员名
例如:studentl.num 表示 studentl变量中的 num 成员,即student1的num(学号)项。可以对变量的成员赋值,例如:
Student1.num=10010:
“.”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把studentl.num 作为一个整体来看待。上面赋值语句的作用是将整数10010 赋给studentl变量中的成员
num。
(2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体变量student1,可以这样访问各成员:
student1.num
student1. birthday.month
注意:不能用student1.birthday来访问studentl变量中的成员birthday,因为birthday 本身是一个结构体变量。
(3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如:
student2. score=studentl. score ;
sum=student1. score+student2.score;
student1.age++;
+ +student1. age;
由于“.”运算符的优先级最高,因此studen1l.age++是对student1.age进行自加运算,而不是先对age进行自加运算。
(4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如:
scanf(" %d",&student1. num); (输入 student1.num的值)
printf("%o",&student1); (输出 studentl的首地址)
但不能用以下语句整体读入结构体变量,如:
scanf("%d,%s,%c,%d,%f,%s",&student1);
结构体变量的地址主要用作函数参数,传递结构体变量的地址。
二、结构体变量的初始化
和其他类型变量一样,对结构体变量可以在定义时指定初始值。例 11.1对结构体变量初始化。
main ()
{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):
运行结果如下:
No.:89031
name:Li Lin
sex:M
address:123 Beijing Road
三、结构体数组
一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组,结构体数组与以肩介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。
1定义结构体数组
和定义结构体变量的方法相仿,只需说明其为数组即可。如:
struct student
{int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}
struct student stu[3];
以上定义了一个数组stu,其元素为struct student类型数据,数组有3个元素,也可以直接定义一个结构体数组,如:
struct student
{int num ;
...
}stu[3];
或
struct
{int num;
}stu[3];
见图 11.4。
数组各元素在内存中连续存放,见图11.5示意。
1
2 结构体数组的初始化
与其他类型的数组一样,对结构体数组可以初始化。如:
struct student
{int num;
char name[20];
char sex;
int age;
float score;
} stu[3]=((10101."Li Lin",'M',18,87.5," 103 BeijingRoad"),(10102," Zhang Fun",'M',19,99,"130 Shanghai Road").{10104." Wang Min",'F',20,78.5,"1010 Zhongshan Road")):
定义数组 stu 时,元素个数可以不指定,即写成以下形式:
stu[]={{…},{…)(…)};
编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。一个结构体常量包括结构体中全部成员的值。
当然,数组的初始化也可以用以下形式:
struct student
{int num;
…
};
struct student stu[]={{…},{…},{…}};
即先声明结构体类型,然后定义数组为该结构体类型,在定义数组时初始化。
从以上可以看到,结构体数组初始化的一般形式是在定义数组的后面加上:
=(初值表列};
3 结构体数组应用举例
下面举一个简单的例子来说明结构体数组的定义和引用。
例11.2对候选人得票的统计程序。设有3个候选人,每次输人一个得票的候选人的名字,要求最后输出各人得票结果。
程序如下:
# include <string.h>
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;<=10;i++)
{scanf("%s",leader-name);
for(j=0;j<3;j++)
if(strcmp (leader_name ,leader[i]. name)==0) leader[j]. count++;
printf("\n");
for(i=0;i<3;i++)
printf(" %5s : %d\n" ,leader[i]. name,leader[i].count);
}
运行情况如下:
Li
Li
Fan
Zhange
Zhangr
Fun
Li
Fun
Zhang
Li
Li:4
Zhang: 3
Fun : 3
程序定义一个全局的结构体数组leader,它有3个元素,每一元素包含两个成员 nume(姓名)和count(票数)。在定义数组时使之初始化,使3位候选人的票数都先置零。
见图11.6。
在主函数中定义字符数组leader_name, 它代表被选人的姓名,在10次循环中每次先输人一个被选人的具体人名,然后把它与3个候选人姓名相比,看它和哪一个候选人的名字相同。注意 leader_name是和leader[i].name相比,leader[j]是数组leader的第j个元素,它包含两个成员项,leader_name应该和 leader数组第j个元素的name成员相比。若j为某一值时,输入的姓名与leader[i].name相等,重执行“leader[j]. count++”,由于成员运算符“.”优先于自增运算符“++”,因此它相当于(leader[j].count)++,使leader[i]的成员count的值加1。在输人和统计结束之后,将3人的名字和得票数输出。