跳转至

结构体

一、枚举(enum)

  1. 用户定义的数据类型

enum 枚举类型名字{名0,名1,...,名n};

  1. 使用时:enum 枚举类型 变量名;

  2. enum就是int

  3. 默认从0开始,自动+1,可中断

二、结构

  1. 结构是一个复合的数据类型,可以有多种数据类型

  2. 声明

    //声明结构类型名再定义变量
    struct point{
        int x;
        int y;
    };
    struct point a,b;
    
    //不声明结构类型名,定义变量
    struct{
        int x;
        int y;
    }a,b;
    
    //声明结构类型名时定义变量、
    struct point{
        int x;
        int y;
    }a,b;
    
  3. 在函数内外

    1. 函数内声明只能在函数内使用
    2. 函数外声明可被多个函数使用
  4. 结构成员

    1. 结构与数组类似
    2. .访问结构里的成员: 结构变量.结构成员
  5. 结构运算

    1. 要访问整个结构,直接用结构变量的名字
    2. 对于整个结构,可以做赋值、取地址,也可以传递给函数参数
      1. p1 = (struct point){5,10}(强制类型转换)
      2. p1 = p2
  6. 结构指针

    1. 与数组不同,结构变量的名字并不是其地址,需要使用&运算符

      struct date *pDate = &today

三、结构与函数

  1. 结构作为函数参数

    1. 整个结构可以作为参数的值传入函数

      int numberofday(struct date d)

    2. 实质:在函数中新建一个结构变量,并复制

    3. 也可以返回一个结构

  2. 输入结构

    1. 通过函数来读入结构

      1. 方案一:传入一个初始结构,并处理,处理结束后将这个结构返回并赋值给一个结构

        struct point getstruct(void){
            struct point temp;
            scanf("%d",&a.x);
            scanf("%d",&a.y);
            return temp;
        }
        
      2. 方案二:指针

        1. 使用->表示指针所指的结构变量中的成员
        int main()
        {
            struct point y={0,0};
            getstruct(&y);
        }
        struct point* getstruct(struct point *p)
        {
            scanf("%d",&p->x);
            scanf("%d",&p->y);
            return *p;
        }
        

        实例:二维坐标点

        #include <stdio.h>
        
        struct point{
            int x;
            int y;
        };
        
        struct point* getstruct(struct point*);
        void output(struct point);
        void print(const struct point*);
        
        int main()
        {
            struct point y = {0,0};
            getstruct(&y);
            output(y);
            output(*getstruct(&y));
            print(getstruct(&y));
            getstruct(&y)->y = 0;
            *getstruct(&y) = (struct point){1,2};
        }
        
        struct point* getstruct(struct point *p){
            scanf("%d",&p->x);
            scanf("%d",&p->y);
            return p;
        }
        
        void output(struct point p){
            printf("%d",&p.x);
            printf("%d",&p.y);
        }
        
        void print(const struct point* p){
            printf("%d %d",p->x,p->y);
        }
        

三、结构中的结构

  1. 结构数组

  2. c struct date { int year, int month, int day }; struct date dates[]={{2021,11,1},{2021,11,2}};

  3. 结构中的结构

  4. ```c struct point{ int x; int y; };

    struct rectan{ struct point point1; struct point point2; }; ```

  5. 如果有变量定义:struct rectan r,*rp=&r,则以下四种情况等价:

    1. rp.point1.x
    2. rp->point1.x
    3. (rp.point1).x
    4. (rp->point1).x

四、类型定义

  1. 自定义数据类型(typedef)

typedef 变量名 想要的变量名;

后续可通过自行命名的名字调用

五、联合

  1. union
  2. 联合起来使用一个空间
  3. 同一个时间只能有一个成员有效
  4. union的大小是其最大的成员
  5. 初始化
  6. 对第一个成员初始化