美文网首页
C语言 结构体,联合体,枚举

C语言 结构体,联合体,枚举

作者: 郎官人 | 来源:发表于2018-05-15 19:37 被阅读0次

    结构体

    C语言中结构体是一组构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型。如:

    struct Man{
        //成员
        char name[20];
        int age;
        //int(*func)();
    };
    
    初始化方式
    struct Man{
        //成员
        char *name;
        int age;
        //int(*func)();
    };
    
    void main(){
        struct Man man;
        man.name = "zs";
        man.age = 20;
        getchar();
    }
    

    或者:

    struct Man man = { "hero", 91 };
    

    也可以这样:

    struct Man{
        char name[20];
        int age;
    } m1, m2 = {"jack",20}; 
    
    匿名结构体(相当于是一个结构体的单例)
    struct{
        char name[20];
        int age;
    }m1;
    
    结构体嵌套
    struct Teacher{
        char name[20];
    };
    
    struct Student{
        char name[20];
        int age;
        struct Teacher t;
    };
    
    struct Student2{
        char name[20];
        int age;
        struct Teacher2{
            char name[20];
        } t;
    };
    
    结构体与指针
    struct Man{
        char name[20];
        int age;
    };
    void main(){
        struct Man m1 = {"Jack",30};
        struct Man *p = &m1;
        printf("%s,%d\n", m1.name, m1.age);
        printf("%s,%d\n",(*p).name,(*p).age);
        printf("%s,%d\n", p->name, p->age);
        //(*env)->
    
        system("pause");
    }
    
    结构体的大小(字节对齐)
    struct Man{
        int age;
        double weight;  
    };
    
    void main(){
        //结构体变量的大小,必须是最宽基本数据类型的整数倍
        //提升读取的效率
        struct Man m1 = {20,89.0};
        printf("%#x,%d\n", &m1,sizeof(m1));
        getchar();
    }
    

    输出结果:

    0x19fd0c,16
    

    上面的示例中,double是8字节,int 4字节。最终的内存大小为16字节。而如果我们在结构体中再添加一个2字节的short成员,如下:

    struct Man{
        int age;
        short size;
        double weight;
    };
    
    void main(){
        //结构体变量的大小,必须是最宽基本数据类型的整数倍
        //提升读取的效率
        struct Man m1 = { 20, 1,89.0 };
        printf("%#x,%d\n", &m1, sizeof(m1));
    
        getchar();
    }
    

    输出结果:

    0xb3fde0,16
    

    能发现,还是16字节,因为之前int只占用了四字节,还有留余。

    结构体与动态内存分配
    struct Man{
        char *name;
        int age;
    };
    void main(){
        struct Man *m_p = (struct Man*)malloc(sizeof(struct Man) * 10);
        struct Man *p = m_p;
        //赋值
        p->name = "Jack";
        p->age = 20;
        p++;
        p->name = "Rose";
        p->age = 20;
        
        struct Man *loop_p = m_p;
        for (; loop_p < m_p + 2; loop_p++){
            printf("%s,%d\n", loop_p->name, loop_p->age);
        }
    
        free(m_p);
        getchar();
    }
    
    别名

    C语言中使用关键字 typedef 为类型取别名。别名的作用主要是为了:

    • 不同名称代表在干不同的事情。
    • 不同情况下,使用不同的别名
    • 书写简洁

    来个Sample:

    struct Man{
        char name[20];
        int age;
    };
    
    //Age int类型的别名
    typedef int Age;
    //Age int类型指针的别名
    typedef int* Ap;
    
    typedef struct Man JavaMan;
    typedef struct Man* JM;
    
    typedef struct Woman{
        char name[20];
        int age;
    } W, *WP; 
    

    上例中,JavaMan 是Man结构体的别名, JM 是Man结构体指针的别名。

    联合体

    联合体也叫共用体。它的特性是:不同类型的变量共同占用一段内存(相互覆盖)。
    联合变量的使用场景是:任何时刻只有一个成员存在的情况下,使用联合体。

    联合体需要用到关键字 union

    union  MyValue{
        int x;
        int y;
        double z;
    };
    
    void main(){
        union MyValue d1;
        d1.x = 90;
        d1.y = 100; //最后一次赋值有效
        d1.z = 23.8;
    
        printf("%d,%d,%lf\n",d1.x,d1.y,d1.z);
        system("pause");
    }
    

    输出结果:

    -858993459,-858993459,23.800000
    

    因为共用同一块内存,前两个成员都被double类型的数据覆盖,在以int读取为值时,出现的就是错误的数字。

    枚举

    枚举就很简单了,跟Java中枚举差别不大。

    enum{
    
        APPLE,
        PEN,
        PEAR
    };
    

    相关文章

      网友评论

          本文标题:C语言 结构体,联合体,枚举

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