(四)C语言之结构体

作者: onestravel | 来源:发表于2019-03-06 18:28 被阅读22次

    (四)C语言之结构体

    一、什么是结构体

    结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据类型

    二、初始化结构体的变量

    1. 第一种初始化方式

    struct [结构体类型] [结构体变量名] = {[结构体内参数实例化值]

    2. 第二种初始化方式

    struct [结构体类型] [结构体变量名] ;

    [结构体变量名].[结构体参数名] = [实例化值];

    例如:

    struct Man
    {
        char name[20];
        int age;
        char* mobile;
        
    };
    void main() {
        struct Man m1 = { "Jack",20 ,"18800008888"};
        printf("%s,%d,%s\n", m1.name, m1.age,m1.mobile);
        //或
        struct Man m2 ;
        //m2.name 数组类型不能直接复制
        strcpy(m2.name, "Rose");
        m2.age = 23;
        m2.mobile = "16600001111";
        printf("%s,%d,%s\n", m2.name, m2.age,m2.mobile);
        getchar();
    }
    

    输出:

    Jack,20,18800008888
    Rose,23,16600001111
    

    三、结构体的几种写法

    1、第一种写法

    例如:

    struct Man{
        char name[20];
        int age;
    };
    void main() {
        struct Man m1 = { "Jack",20};
        printf("%s,%d\n", m1.name, m1.age);
        getchar();
    }
    

    2、第二种写法,可以在结构体类型的}后,定义结构体变量名,也可以对结构体变量名进行初始化。

    例如:

    struct Man {
        char* name;
        int age;
    } Man,m2={"jack",20};
    
    void main() {
        Man.name = "Tom";
        Man.age = 19;
        printf("%s,%d\n", Man.name,Man
        .age);
        getchar();
    }
    

    3、第三种写法:匿名结构体,控制结构体变量的个数(限量版),相当于单例

    例如:

    struct  {
        char* name;
        int age;
    } Woman;
    
    void main() {
        Woman.name = "Lili";
        Woman.age = 19;
        printf("%s,%d\n", Woman.name,Woman
        .age);
        getchar();
    }
    

    四、结构体嵌套

    结构体是可以进行嵌套使用的,可以分别定义使用,或者在一个结构体中定义另一个结构体

    1、分别定义结构体嵌套

    例如:

    // 老师的结构体
    struct Teacher {
        char name[20];
    };
    
    // 学生的结构体
    struct Student {
        char name[20];
        int age;
        struct Teacher t;
    };
    
    void main() {
        struct Student s1 = { "jack",21,{"Jason"} };
        struct Student s2;
        strcpy(s2.name, "Tom");
        s2.age = 23;
        strcpy(s2.t.name, "Jason");
        getchar();
    }
    
    

    2、结构体内定义结构体嵌套

    例如:

    // 学生的结构体
    struct Student {
        char name[20];
        int age;
        // 老师的结构体
        struct Teacher {
            char name[20];
        } t;
    };
    
    void main() {
        struct Student s1 = { "jack",21,{"Jason"} };
        struct Student s2;
        strcpy(s2.name, "Tom");
        s2.age = 23;
        strcpy(s2.t.name, "Jason");
        getchar();
    }
    
    

    五、结构体与指针

    结构体变量也可以使用指针进行操作,"p->"是"(*p)."的简写形式

    例如:

    struct Man{
        char name[20];
        int age;
    };
    
    void main(){
        struct Man m1 = {"Jack",30};
        //结构体指针
        struct Man *p = &m1;
        printf("%s,%d\n",(*p).name,(*p).age);
        //"p->"是"(*p)."的简写形式
        printf("%s,%d\n",p->name,p->age);
        getchar();
    }
    

    六、结构体数组与指针

    结构体变量也可以使用指针进行操作,"p->"是"(*p)."的简写形式

    例如:

    struct Man {
        char name[20];
        int age;
    };
    
    void main() {
        struct Man mans[] = { {"Jack",30},{"Rose",19} };
        //遍历数组
        struct Man *p = mans;
        for (; p < mans + 2; p++) {
            printf("%s,%d\n", p->name, p->age);
        }
    
        int i = 0;
        for (; i < sizeof(mans) / sizeof(struct Man); i++) {
            printf("%s,%d\n", mans[i].name, mans[i].age);
        }
        getchar();
    }
    

    七、结构体的大小(字节对齐)

    结构体的大小必须是结构体中最宽基本数据类型的整数倍

    牺牲一定的存储空间(本需要12字节的空间,实际分配16字节,(最宽基本数据类型的整数倍)),提升读取的效率

    例如:

    struct Man {
        int age;
        double weight;
    };
    
    void main() {
        struct Man m1 = { 20,80.9 };
        printf("%#x,%d\n", &m1,sizeof(m1));
        getchar();
    }
    

    输出:

    0xcffcc4,16
    

    八、结构体与动态内存分配

    struct Man{
        char *name;
        int age;
    };
    
    void main(){
        struct Man *man_p = (struct Man*)malloc(sizeof(struct Man)*10);
        struct Man *p = man_p;
        //赋值
        p->name = "Jack";
        p->age = 20;
        p++;
        p->name = "Rose";
        p->age = 23;
        
        struct Man *loop_p =man_p  ;
        for(;loop_p < man_p+2;loop_p++){
            printf("%s,%d\n",loop_p->name,loop_p->age);
        }
        free(man_p);
        getchar();
    }
    

    九、typedef 类型取别名

    1、不同的名称代表在干不同的事情;typedef int jint;

    2、不同的情况下,使用不同的别名

    if(_cplusplus){
        typedef _JNIEvn JNIEvn;
        typedef _JavaVM JavaVM;
    
    }
    

    3、书写简洁

    struct Man{
        char *name;
        int age;
    };
    
    
    //Age  int 类型的别名
    typedef int Age;
    //Ap int 类型指针的别名
    typedef int* Ap;
    
    typedef struct Man JavaMan;
    typedef struct Man* JM;
    //简写
    typedef struct Woman{
        char name[20];
        int age;
    } W,*WP;// W 是Woman结构体的别名;WP 是Woman结构体指针的别名。
    
    
    void main(){
        int i = 5;
        Ap p = &i;
        //结构体变量
        W w1 = {"Rose",25};
        //结构体指针
        WP wp1 = &w1;
        
        printf("%s,%d\n",wp1->name,wp1->age);
        getchar(); 
    }
    

    十、结构体函数指针成员

    #include <Windows.h>
    //Girl 结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法
    struct Girl{
        char *name;
        int age;
        //函数指针
        void(*sayHi) (char*);
    };
    
    void sayHi(char* text){
        MessageBoxA(0,text,"title",0);
    }
    
    void main(){
       struct Girl g1;
       g1.name = "Lucy";
       g1.age = 18;
       g1.sayHi = sayHi;
       
       g1.sayHi("Hello!");
       getchar(); 
    }
    

    取别名的写法

    #include <Windows.h>
    //Girl 结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法
    typedef struct Girl{
        char *name;
        int age;
        //函数指针
        void(*sayHi) (char*);
    }Girl;
    
    //Girl结构体指针取别名
    typedef Girl* GirlP;
    
    void sayHi(char* text){
        MessageBoxA(0,text,"title",0);
    }
    
    void main(){
       struct Girl g1 = {"Lucy",19,sayHi};
       GirlP gp1 = &g1;
       gp1->sayHi("Hello");
       getchar(); 
    }
    

    相关文章

      网友评论

        本文标题:(四)C语言之结构体

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