结构体

作者: 牧_青 | 来源:发表于2020-08-28 00:03 被阅读0次

      基本类型只能表示单一的类型,但是如果要表示复杂的场景,比如说表示学生,其中包含id,name,age这是就不能用某个基本类型来表示。为此,C语言引入了结构体的概念。

    1、普通结构体的声明,定义和使用

    1.1、声明

      在使用结构体之前,需要先声明它。一般形式为:

    struct struct_name {
        类型说明符 成员名;        // 每个成员变量都有分号(;)作为结尾
        类型说明符 成员名;
        ...;
    };         // 结构体最后用分号表示结束
    # exam:
    struct stu {
        int id;
        char *name;
        int age;
    };
    

    1.2、定义

      声明了结构体之后,系统并没有为这个结构体分配内存空间,如果需要对这个结构体进行赋值等运算,需要为这个结构体定义变量。
      定义结构体变量一般有三种方式:
       1. 先声明,再定义
       2. 声明的同时定义变量(包括结构体名称)
       3. 声明的同时定义变量(省略结构体名称)

    # 先声明,在定义
    struct stu {
        int id;
        char *name;
        int age;
    };
    struct stu student1, student2;   // 需要注意,此处struct不能省略
    
    # 声明时直接定义变量(包括结构体名称)
    struct stu {
        int id;
        char *name;
        int age;
    } student1, student2;
    
    # 声明时直接定义变量(省略结构体名称)
    struct {
        int id;
        char *name;
        int age;
    } student1, student2;     //注意这种和第二种的区别
    

      此外,可以直接使用宏定义#define使用一个符号常量来表示一个结构体类型,其用法也和上面类似。

    #define Stu struct stu
    Stu {
        int id;
        char *name;
        int age;
    };
    Stu student1, student2;
    

    1.3、使用

      c语言通常不会讲一个结构体变量当成一个完成的变量来使用,除了允许相同类型的结构体相互赋值之外,对其的赋值,输入,输出, 运算等都是通过结构体成员变量来实现的(所以别老想着像go语言一样对结构体整个输出)。

    1.3.1、成员表示

      结构体成员的表示通常有两种方式:
      1. 结构体变量名.成员名
      2. 结构体指针->成员名

    student1.id = 1;
    student2.id = 2;
    

    1.3.2、结构体变量赋值

      如前所说,除了类型相同的结构体之间可以相互赋值外,结构体的赋值操作都是通过结构体的成员变量来实现的。除此之外,结构体变量在定义的时候可以进行整体赋值。
      所以说,结构体变量赋值有三种:
      1. 针对结构体的每个成员变量进行赋值
      2. 对于相同结构体,可以直接相互赋值
      3. 结构体变量如果在定义时赋值,可以进行整体赋值(需要注意,如果先定义,再赋值,就不能进行整体赋值)

    struct stu {
        int id;
        char *name;
        int age;
    } student1, student2, student3 = {3, "xiaohong", 18};  //  声明时定义变量进行整体赋值
    // 针对每个成员变量进行赋值
    student1.id = 1;
    student1.name = "xiaoming";
    student1.age = 18;
    
    // 相同结构体变量之间进行赋值
    student2 = student1;
    
    // 定义变量时进行赋值
    stu student4 = {4, "xiaolan", 18};
    // 需要注意,以下做法是错误的
    // stu student5
    // student5 = {5, "xiaohuang", 18};   //error: expected expression   student5 = {5, "xiaohuang", 18}; 
    

    1.4、结构体数组

      数组的元素也可以是结构体类型,用来表示相同数据结构的一个群体。
      结构体数组的定义方式和结构体变量定义相似,只需要说明它是数据类型即可。

    struct {
        int id;
        char *name;
        int age;
    }student[2]= {
        {1, "xiaoming", 18};
        {2, "xiaohuang", 18};
    };    //此处如果对数组中的所有成员赋值,也可不给出数组长度。
    

    留坑待填~

    1.5、结构体指针

    1.5.1、指向结构体的指针

    1.5.2、结构体指针作为函数参数

    1.6、动态分配存储

    l

    相关文章

      网友评论

          本文标题:结构体

          本文链接:https://www.haomeiwen.com/subject/cuihsktx.html