一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据),如果有10个学生需要参加运算,显然应该用数组,这就是结构体数组。
例9.3 有三个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。
编写程序:
#include
#include
struct Person{
char name[20]; //候选人名字
int count; //候选人得票数
}leader[3]={"Li",0,"zhang",0,"sun",0};
int 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("\nResult:\n");
for(i=0;i<3;i++)
printf("%5:%d\n",leader[i].name,leader[i].count);
return 0;
}
(1)定义结构体数组一般形式是
1.struct结构体名
{成员表列} 数组名[数组长度];
2.先声明一个结构体类型,然后再用此类型定义结构体数组:
结构体类型 数组名[数组长度];
struct Person leader[3]; //leader是结构体数组名
(2)对结构体数组初始化的形式是在定义数组的后面加上:
={数组表列};
比如:struct Person leader[3]={"Li",0,"zhang",0,"sun",0};
if(stu[j].score>stu[k].score) //进行成绩的比较
k=j;
temp=stu[k];stu[k]=stu[i];stu[i]=temp; //stu[k]和stu[i]元素互换
所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素。
例9.5 通过指向结构体变量的指针变量输出结构体变量中成员的信息。
解题思路:
(1)怎样对结构体变量成员赋值
(2)怎样通过结构体变量的指针访问结构体变量中成员
#include
#include
int main(){
struct Student //声明结构体类型struct Student
{long num;
char name[20];
char sex;
float score;};
struct Student stu_1;
struct Student *p;
p=&stu_1; //p指向stu_1
stu_1.num=10101;
strcpy(stu_1,name,"li min");
stu_1.sex='M';
stu_1.score=89.5;
printf("no.:%ld\nname:%s\nsex:%c\nscore:%5.lf\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);
return 0;
}
可以用指针变量指向结构体数组的元素。
例9.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。
解题思路:用指向结构体变量的指针来处理。
(1)声明结构体类型struct Student,并定义结构体数组,同时使之初始化。
(2)定义一个指向struct Student类型数据的指针变量p;
(3)使p指向结构体数组的首元素,输出它指向的元素中的有关信息;
(4)使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息;
(5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息。
编写程序:
#include
struct Student{
int num;
char name[20];
char sex;
int age;
};
struct Student stu[3]={{10101,"li lin",'m',18},{10102,"zhang zhi",'m',19},{10103,"zhang san",'f',20}} //定义结构体数组并初始化
int main(){
struct Student *p; //定义指向struct Student结构体变量的指针变量
printf("no.name sex age\n");
for(p=stu;pnum,p->name,p->sex,p->age);
return 0;
}
将一个结构体变量的值传递给另一个函数,有三个办法:
(1)用结构体变量的成员作参数。例如,用stu[1].num或stu[2].name作函数实参,将实参值传给形参。
(2)用结构体变量作实参。
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。