• 枚举:枚举值的类型一定是int,没有其他类型。从0开始,依次递增。
  • 有一个小套路:
    enum COLOR {red, green, blue, purple, numCOLORS};
    // 因为枚举值是从0开始依次递增,所以最后一个值是和前面的个数相等的。比如前面有4个值,而numCOLORS也是4. 于是就用 最后一个numCOLORS 来表示枚举里有多少个值。方便使用。

     

  • 枚举也可以不从0开始,人为指定也可以(但一定是int)
    enum color {red=1, blue, yellow=8, white}; //blue == 2, white == 9
    // 当然这个时候就不能使用上面的小套路了

     

  • 结构体:整个结构体可以作为函数参数的值传入函数。这时候是在函数内新建一个结构体变量,并复制调用者的结构体的值(与数组完全不同) int test(struct list L){} 也可以返回一个结构体。
  • 结构体里面嵌套结构体很难理解,可以试着把结构体嵌套关系用一个图来表示便于理解。
  • 没有直接的方式可以一次scanf一个结构体的,只能逐个给成员赋值。
    #include <stdio.h>
    
    struct point {
        int x;
        int y;
    };
    
    void  getStruct (struct point) ;
    void output(struct point);
    void main ()
    {
        struct point y = {0,0};
        getStruct(y);
        output(y);
    }
    
    void getStruct(struct point p)
    {
        scanf("%d", &p.x);
        scanf("%d", &p.y);
        printf("%d, %d\n", p.x, p.y);
    }
    
    void output(struct point p)
    {
        printf("%d, %d", p.x, p.y); //输出0,0 而不是用户输入的值。
    }
    View Code

    结构体是创建了一个副本,所以函数调用者想使用修改后的结构体,有两个办法,一种是函数返回一个结构体给调用者,另一个是使用指针。传整个结构体开销太大,so,最好是用指针。