首页 > 代码库 > 有关结构体的认识应用

有关结构体的认识应用


最近把结构体的部分知识又仔细的研究学习了一下,总结了一下内容,希望者篇文章对那些对结构体模糊的人c结构体

 1, 结构体是一种自定义的数据类型,也是用来存储多个数据的大容器不过结构体要比数组灵活,它可以存储不同类型的数据

2, 结构体的定义

    struct + 结构体名字 {大括号中填写结构体成员,多个结构体成员之间通过分号间隔}

     如下:

    struct student {

        // 结构体成员

        char name[20];//存储姓名

        char sex;   // 存储性别

        int number; //存储学号

        int score;  // 存储分数

    };// 分号是结构体定义结束的标志,必不可少


     

3, typedef 类型重定义,即给已有的类型重新起一个名字,新的名字和原类型具有同样的功能;

     

    typedef 第一种格式, 先定义结构体类型,然后再typedef

     :typedef int  integer;

     给结构体类型 struct student 重新定义一个名字Stu

     typedef struct student Stu;

     

    typedef 第二种格式, 定义结构体的同时,typedef (这种格式比较常用)

    typedef struct point1 {

        float abscissa; //存储横坐标

        float ordinate; //存储纵坐标

    }Poi1;

     其中Poi1此后可以作为一个数据结构类型应用

     : Poi1 p1 = {};就是定义了一个结构体类型变量p1

4, 结构体变量访问结构体成员的方式,通过结构体变量.结构体成员,

     : printf("number = %d\n",stu.number);

5, 结构体数组:

     // 定义一个学生结构体变量

    Stu person[4] = {{"Frank",‘f‘,22,10086,87},{"Duck",‘f‘,28,10087,93},{"Xiaoming",‘f‘,27,10088,93},{"Phone",‘f‘,25,10089,75}};

    // 运用结构体数组对学生按成绩排序:

    for (int i = 0; i < 4; i ++) {

        if (person[i].score > scoreMax.score) {

            scoreMax = person[i];

        }

        if (person[i].age < ageMin.age) {

            ageMin = person[i];

        }

    }



6, 结构体内存分配原则

     以结构体成员所规定的存储空间最大的空间大小为单位来进行分配,

     最大空间的最小整数倍

7, 结构体可以嵌套, 即在一个结构体中的结构体成员是另一个结构体类型的变量

     :先定义一个日期的结构体Date

    typedef struct  birthday

    {

        int year;

        int month;

        int day;

    }Birth;


     :结构体嵌套, 在一个结构体中的结构体成员是另一个结构体类型的变量

    typedef struct stu {

        char name[20];   //存储学生姓名

        char sex;       //存储学生性别

        int age;        // 存储学生年龄

        int score;     //存储学生分数

        Birth birth;   //出生日期

    }Stu;

     

     8,练习

1), 定义一个结构体变量(包含年月日),计算该日在本年中为第几天?要求写一个days函数。参数是此结构体类型的变量,返回值是整数。

    int days(date dat)

    {

        int a[12] = {0,31,59,90,120,151,181,212,243,273,304,334};

        int day = 0;

        BOOL isTrue ; // 用于判断该年是否为闰年

        // 判断该年是否为闰年

        if (dat.year % 400 == 0 || (dat.year % 4 == 0 && dat.year % 100 != 0)) {

            isTrue = 1;  // 如果该年是闰年,isTrue 1

        } else {

            isTrue = 0;

        }

        day += a[dat.month - 1] + dat.day;

        day += isTrue && dat.month >= 3 ? 1 : 0;

        return day;

    }

2), 5名学生保存在结构体数组中,编程按学生的姓名降序排序

    

    void sortName(Stu a[],int n)

    {

        for (int i = 0; i < n - 1; i ++) {

            for (int j = 0; j < n - 1 -i ; j ++) {

                if (strcmp(a[j].name, a[j + 1].name ) < 0)  {

                    Stu temp = a[j]; //temp 为中间变量,用于交换两个结构体元素

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }

        }

        

    }