一、结构体数组概念及定义
1、概念
数组的元素也可以是结构类型。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体,例如一个班的学生档案,一个车间职工的工资表等。
例如:
//方法一:定义一个结构体的同时定义结构体数组
struct Contact{
char name[20];
char number[20];
char address[20];
char email[20];
}contacts[10];
//方法二:先定义一个结构体数组,再定义一个结构体数组
struct Contact{
char name[20];
char number[20];
char address[20];
char email[20];
};
struct Contact contacts[10];
2.结构数组的初始化和遍历
举例应用:
#include
//先定义一个结构体
struct Student{
int num;
char *name;
char sex;
float score;
};
int main(int argc, const char * argv[])
{
//定义结构体数组、同时进行初始化
struct Student list [5] = {
{101,"Amos",'M',90.0f},
{102,"Allen",'M',80.9f},
{103,"Andy",'M',40.3f},
{104,"Sherry",'M',58.9f},
{105,"Barry",'M',100.0f},
};
//1、利用上面的结构体,计算学生的平均成绩和不及格人数
//2、打印80-100分学生的成绩和姓名
float avg = 0;//平均分
int sum = 0;//不及格人数
printf("成绩在80到100之间的学生姓名和分数如下:\n");
for (int i = 0; i < 5; i++) {
avg += list[i].score;
if (60 > list[i].score) {
sum++;
} else if(list[i].score >= 80){//假设满分为100
printf("name:%s,score:%0.2f\n",list[i].name, list[i].score);
}
}
avg /= 5;//求平均成绩
printf("\n班级平均成绩为:%0.2f, 不及格人数为:%d\n", avg, sum);
return 0;
}
打印结果:
成绩在80到100之间的学生姓名和分数如下:
name:Amos,score:90.00
name:Allen,score:80.90
name:Barry,score:100.00
班级平均成绩为:74.02, 不及格人数为:2
二、结构体指针定义和初始化
1、概念
一个指针变量当用来指向一个结构体变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构体指针即可访问该结构体变量。这与数组指针和函数指针的情况是相同的。
2.定义和初始化
//先定义一个结构体
struct Student{
int num;
char *name;
char sex;
float score;
};
//定义一个结构体指针
struct Student stu;
struct Student * student = &stu;
stu.score = 90.0f;
stu.num = 102;
stu.sex = 'F';
stu.name = "Amoe";
//方法一:用.符号访问
printf("num:%d, name:%s, sex:%c, score:%0.2f\n\n",(*student).num, (*student).name, (*student).sex, (*student).score);
//方法二:用->符号访问,只要当用结构体指针的时候才可以使用这个操作符
printf("num:%d, name:%s, sex:%c, score:%0.2f",student->num, student->name, student->sex, student->score);
打印结果:
方法一
num:102, name:Amoe, sex:F, score: 90.00
方法二
num:102, name:Amoe, sex:F, score: 90.00
三、结构体嵌套使用
1.结构体嵌套
1)成员也可以又是一个结构,即构成了嵌套的结构
【注意】结构体嵌套:结构体定义的里面有【其他结构体】
不能嵌套自己的变量,但是可以嵌套本身结构体的指针变量。
例如:
//先定义一个结构体
struct Student{
int num;
char *name;
char sex;
float score;
struct Student * student;//不会报错,可以嵌套该结构体的指针变量
struct Student stu;//会报错,不能嵌套该结构体的变量
};
2)定义并初始化嵌套结构体
例如:
#include
//先定义一个结构体
struct Student{
int num;
char *name;
char sex;
float score;
struct Student * st;//不会报错,可以嵌套该结构体的指针变量
};
int main(int argc, const char * argv[])
{
//定义并初始化嵌套结构体
struct Student stu = {102,"Alle",'M',89.0f,NULL};
struct Student student = {101,"Amos",'M',90.0f, &stu};
printf("Student number:%d, name:%s, sex:%c,score:%0.2f\nstudent: number:%d, name:%s, sex:%c, score:%0.2f",student.num,student.name,student.sex,student.score,student.st->num,student.st->name,student.st->sex,student.st->score);
return 0;
}
打印结果:
Student number:101, name:Amos, sex:M, score:90.00
student: number:102, name:Alle, sex:M, score:89.00