• C语言-数据结构-结构体


    一、结构体的定义

    数组(Array)是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。

    结构体(Struct)可以来存放一组不同类型的数据。其是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

    结构体的定义形式为:

    struct 结构体名{
        结构体所包含的变量或数组
    };

    例如:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在学习小组
    };

    定义结构体变量:

    struct stu stu1,stu2;

     或者在定义结构体的同时定义变量:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在学习小组
    }stu1,stu2;

     常用的是利用typedefstruct stu取别名:

    typedef struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在学习小组
    }student;
    student stu1, stu2;

    给结构体变量赋值:

        stu1.name = "Tom";
        stu1.num = 12;
        stu1.age = 18;
        stu1.group = 'A';
        stu1.score = 136.5;

    二、结构体数组的定义

    //赋值
    struct
    stu stu1[5]; //或student stu1[5];
    //赋值
    class[5] = { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }

    结构体数组的使用,例如,

    获取 Wang ming 的成绩:stu1[4].score; 

    修改 Li ping 的学习小组:class[0].group = 'B';

    三、结构体指针

    当一个指针变量指向结构体时,我们就称它为结构体指针。C语言结构体指针的定义形式一般为:

    struct 结构体名 *变量名;

    注意,结构体变量名数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给 pstu 赋值只能写作:

    struct stu *pstu = &stu1;

    获取结构体成员:.的优先级高于*(*pointer)两边的括号不能少。

    (*pointer).memberName

    或:->是一个新的运算符,可以通过结构体指针直接取得结构体成员;

    pointer->memberName

    结构体指针作为函数参数:

    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。

    注意:结构体数组指针的使用(结构体数组变量名前不需要加&

    #include <stdio.h>
    
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }stus[] = {
        {"Zhou ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"Liu fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    }, *ps;
    
    int main(){
        //求数组长度
        int len = sizeof(stus) / sizeof(struct stu);
        printf("Name		Num	Age	Group	Score	
    ");
        for(ps=stus; ps<stus+len; ps++){
            printf("%s	%d	%d	%c	%.1f
    ", ps->name, ps->num, ps->age, ps->group, ps->score);
        }
    
        return 0;
    }
  • 相关阅读:
    There is no Action mapped for namespace [/pages/action/student] and action name [findStudent]
    站点设计至尊 (展示文)
    【翻译自mos文章】DBA_JOBS 和 DBA_JOBS_RUNNING 不同的结果的解释
    Effective C++ 条款45
    NYOJ109 数列转换 【守恒法】
    Windows 上安装 pip
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0
    解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]
    neuroph Perceptron Sample
    Visio 画图去掉页边距(图形四周的空白区域)的解决办法
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12301971.html
Copyright © 2020-2023  润新知