一、结构体数组概念及定义
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 <stdio.h> //先定义一个结构体 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 <stdio.h> //先定义一个结构体 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