结构体

作者: Vergil_wj | 来源:发表于2021-07-22 08:19 被阅读0次

    为什么会出现结构体

    为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。

    例如:

    如果使用普通类型变量表示学生:

    int sid;  //学号
    char name[200];  //姓名
    int age;  //年龄
    

    使用普通变量,我们需要定义大量的基本类型来表示不同学生的学号、姓名、年龄,数据容易搞混。

    使用结构体,可以很方便的表示一个学生:

    struct strdent {
      int sid;
      String name;
      int sage;
    };
    

    结构体和 java 中的类很像,只不过结构体中没有方法:

    class strdent {  //类的关键字为 class
      int sid;
      String name;
      int sage;
    
      void inputStudent() {  //类中有方法,结构体中没有方法
      }
    }
    

    可以说结构体是类的一个过渡。

    什么是结构体

    结构体是用户根据实际需求自己定义的复合数据类型。

    结构体是数据类型,不是变量。

    如何使用结构体

    两种方式:

    struct Student st = {1000,"zhangsan",20} ;

    struct Student * pst = &str;

    1. st.sid
    2. pst->sid(pst 所指向结构体变量中的 sid 这个成员)

    第一种:st.sid

    # include <stdio.h>
    # include <string.h>
    
    struct Student
    {
      int sid;
      char name[200];
      int age;
    };  //分号不能省略
    
    int main(voie)
    {
      struct Student st = {1000,"zhangsan",20} ;  //定义变量 st,同时赋值
      printf("%d %s %d",st.sid,st.name,st.age);  // 1000 zhangsan 20
    
      //第二种给结构体成员赋值方式,变量名 + 点 
      st.sid = 99;
      //st.name = "lisi";  //error,C 语言中 string类型不能直接赋值。
      strcpy(st.name,"lisi");
      st.age = 22;
      printf("%d %s %d",st.sid,st.name,st.age);  // 1000 zhangsan 20
    
      return 0;
    
    }
    

    第二种:pst->sid

    # include <stdio.h>
    # include <string.h>
    
    struct Student
    {
      int sid;
      char name[200];
      int age;
    };  //分号不能省略
    
    int main(voie)
    {
      struct Student st = {1000,"zhangsan",20} ;  
      //st.sid = 99;  //第一种方式
    
      struct Student * pst;
      pst = &st;
      pst->sid = 99;//第二种方式
    
      return 0;
    
    }
    
    • pst->sid 等价于 (*pst).sid,*pst 等价于 st,(*pst).sid 等价于 st.id,即 pst->sid 等价于 st.sid。

    注意事项

    1、结构体变量不能加减乘除,但可以相互赋值。

    2、普通结构体变量和结构体指针变量作为函数传参问题。

    # include <stdio.h>
    # include <string.h>
    
    struct Student
    {
      int sid;
      char name[200];
      int age;
    };  //分号不能省略
    
    void f(struct Student *pst); //前置声明函数
    void g1(struct Student st);
    void g2(struct Student *pst);
    
    int main(voie)
    {
      struct Student st ;  //已经为 st 分配好了内存。
    
      f(&st);  // 函数输入
      printf("%d %s %d\n",st.sid,st.name,st.age)
    
    
      // 函数输出
      g1(st);  //1、执行速度慢  2、浪费空间,最少传递了 208 个字节(int sid 4个字节,char name[200] 个字节,int age 4 个字节)。
      g2(&st);  // 此方式只发送了 4 个字节(指针变量占用4个字节)
        
    
      return 0;
    }
    
    void f(struct Student *pst)
    {
        pst->sid = 99;  // 也可以写成 (*pst).sid = 99
        strcpy(pst->name,"zhangsan");
        pst->age = 22;
    }
    
    //这种方式耗内存,耗时间,不推荐。
    void g1(struct Student st)
    {
        printf("%d %s %d\n",st.sid,st.name,st.age)
    }
    
    //推荐这种,只发送了地址。
    void g2(struct Student *pst)
    {
        printf("%d %s %d\n",pst->sid,pst->name,pst->age)
    }
    

    相关文章

      网友评论

          本文标题:结构体

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