黑马程序员----C 语言学习笔记之结构体数组,指针,嵌套的使用

时间:2021-02-28 00:27:55
------Java培训、Android培训、iOS培训、.Net培训--------

、结构体数组概念及定义

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;
}


 

打印结果:

成绩在80100之间的学生姓名和分数如下:

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