结构体数组是一种用于存储一组具有相同类型结构体的数据结构。
结构体数组的定义和使用
定义结构体数组一般形式是
struct Person{char name[20];int count;
}leader[5];
先声明一个结构体类型,然后再用此类型定义结构体数组
struct Person{char name[20];int count;
};void main(){struct Person leader[5];
}
结构体数组初始化
struct Person leader[3]={{"zhangsan",1},{"lisi",2},{"wangwu",3}};
【例9.4】有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。
#include<stdio.h>
/*【例9.4】有n个学生的信息(包括学号、姓名、成绩),
要求按照成绩的高低顺序输出各学生的信息。*/
struct Student{int number;char name[20];float score;
};void main(){struct Student stus[5]={{1001,"zhangsan",78},{1001,"lisi",56},{1001,"wangwu",69},{1001,"zhaoliu",95},{1001,"tianqi",88}};int i,j,n=5,k;struct Student temp;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){if(stus[j].score > stus[k].score ){k=j;}}if(k!=i){temp = stus[i];stus[i] = stus[k];stus[k] = temp;}}for(i=0;i<n;i++){printf("%d %s %.1f\n",stus[i].number,stus[i].name,stus[i].score);}}
结构体指针的定义和使用
所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。
【例9.5】通过指向结构体变量的指针变量输出结构体变量中成员的信息。
#include<stdio.h>
#include<string.h>
struct Student{int number;char name[20];float score;
};void main(){struct Student stu={1,"zhangsan",50.0f};struct Student *p = &stu;(*p).number = 2;strcpy((*p).name,"lisi");(*p).score = 60.0f;printf("%d %s %.1f\n",stu.number,stu.name,stu.score);printf("%d %s %.1f\n",(*p).number,(*p).name,(*p).score);printf("%d %s %.1f\n",p->number,p->name,p->score);
}
【例9.6】有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。
#include<stdio.h>
#include<string.h>
struct Student{int number;char name[20];int age;
};void main(){struct Student stus[]={{1,"zhangsan",20},{2,"lisi",19},{3,"wangwu",18}};struct Student *p = stus;printf("No Name age\n");for(p=stus;p<stus+3;p++){printf("%d %s %d\n",p->number,p->name,p->age);}
}
用结构体变量和结构体变量的指针作函数参数
将一个结构体变量的值传递给另一个函数,有3个方法:
- 用结构体变量的成员作实参。
值传递
- 用结构体变量作实参。
值传递
- 用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。
地址传递
值传递不能影响主调函数的变量。