zoukankan      html  css  js  c++  java
  • 【C】Re09 结构体

    一、结构体 Struct

    创建和基本使用

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 自定义数据类型 : 结构体
    struct Person {
        int age;
        char id[18];
        char name[20];
        int gender;
    };
    
    // 创建结构体数据类型
    void createStructType ( ) {
        struct Person man = {
                23,
                "363301199804023324",
                "tom",
                1
        };
    
        // 访问结构体数据通过点
        printf("man age -> %d
    ", man.age);
        printf("man id -> %s
    ", man.id);
        printf("man name -> %s
    ", man.name);
        printf("man gender -> %d
    ", man.gender);
    }
    
    // 方式二 声明结构体之后附加变量名称
    struct Ac {
        int property1;
        char property2[18];
        char property3[20];
        int property4;
    } sss; // 再后面声明变量名称
    
    void createStructType2() {
        sss.property1 = 12;
        // 不可以直接赋值  sss.property2 = "sdas";
        strcpy(sss.property2, "sss");
    }
    
    
    int main() {
        createStructType();
    
        return 0;
    }

    属性值的交换:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Struct {
        int property1;
        char property2[10];
        double property3;
    };
    // 赋值操作
    void structAssignment() {
        struct Struct s1;
        struct Struct s2 = {
                22,
                "张三",
                22.55
        };
    
        // 赋值方式1 为s1 逐个赋值操作
        s1.property1 = s2.property1;
        strcpy(s1.property2, s2.property2);
        s1.property3 = s2.property3;
    
        // 赋值方式2 允许操作整体赋值的方式
        s1 = s2;
    
        // 赋值方式3 使用memcpy函数
        memcpy(&s1, &s2, sizeof(struct Struct));
    }
    // 属性值交换操作
    void structPropertyChange() {
        struct Struct s1 = {
                10,
                "李四",
                100.23
        };
        struct Struct s2 = {
                22,
                "张三",
                22.55
        };
    
        int property1Temp = s1.property1;
        s1.property1 = s2.property1;
        s2.property1 = property1Temp;
    
        // char property2Temp[10] = s1.property2;
        char property2Temp[10];
        strcpy(property2Temp, s1.property2);
        strcpy(s1.property2, s2.property2);
        strcpy(s2.property2, property2Temp);
    
        double property3Temp = s1.property3;
        s1.property3 = s2.property3;
        s2.property3 = property3Temp;
    
        // 结构体允许整体作为一个TEMP进行交换操作
        struct Struct tempStruct;
        tempStruct = s1;
        s1 = s2;
        s2 = tempStruct;
    }
    
    int main() {
        structPropertyChange();
        return 0;
    }

    结构体数组:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Struct {
        int property1;
        char property2[10];
        double property3;
    };
    
    void structArray() {
        struct Struct structs[5] =  {
                {1,"张三1", 23.23},
                {2,"张三2", 23.23},
                {3,"张三3", 23.23},
                {4,"张三4", 23.23},
                {5,"张三5", 23.23},
        };
    
        int size = sizeof(structs) / sizeof(struct Struct);
    
        for (int i = 0; i < size; ++i) {
            printf(
                    "element%d p1 : %d p2 : %s, p3 : %.2f
    ",
                    i,
                    structs[i].property1,
                    structs[i].property2,
                    structs[i].property3
                    );
        }
    }
    
    int main() {
        structArray();
        return 0;
    }

    嵌套的结构体:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 结构体嵌套
    struct Student {
        char stuID[10];
        char name[4];
    };
    struct Teacher {
        char teachID[5];
        char name[4];
        struct Student student;
    };
    
    
    void structNesting() {
        // 嵌套结构体创建方式
        struct Teacher li = {
                "133001",
                "李四",
                { "122001", "小明"}
        };
        // 允许修饰括号进行赋值
        struct Teacher jie = {
                "133002",
                "杰哥",
                "122001",
                "小明"
        };
        
        // 调用
        printf(
                "nestingStructs -> teacherID : %s, name : %s, stuID : %s, stuName : %s
    ",
                li.teachID,
                li.name,
                li.student.stuID,
                li.student.name
                );
    }
    
    int main() {
        structNesting();
        return 0;
    }

    二、结构体和指针

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 结构体与指针
    struct Student {
        int id;
        char name[4];
        double score;
    };
    
    void structWithPointer () {
        struct Student student = { 1, "Tom", 98.5 };
        struct Student * studentPointer = &student; // 结构体指针
    
        // 使用指针调用结构体属性的方式
        printf(
                "use studentPointer to get properties :
     id : %d, name : %s, score : %.2f
    ",
                studentPointer -> id,
                studentPointer -> name,
                studentPointer -> score
                );
        // 使用结构体属性的方式调用:
        printf(
                "use structVariable to get properties :
     id : %d, name : %s, score : %.2f
    ",
                student.id,
                student.name,
                student.score
        );
    
        // 使用解引用 == 结构体变量
        printf(
                "use *studentPointer to get properties :
     id : %d, name : %s, score : %.2f
    ",
                (*studentPointer).id,
                (*studentPointer).name,
                (*studentPointer).score
        );
    
        // 使用解地址 == 结构体指针
        printf(
                "use &student to get properties :
     id : %d, name : %s, score : %.2f
    ",
                (&student) -> id,
                (&student) -> name,
                (&student) -> score
        );
    }
    
    int main() {
        structWithPointer ();
        return 0;
    }

     三、结构体与堆区

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct Student {
        int id;
        char * name;
        int age;
    };
    
    void test() {
        struct Student student = {
                12003,
                "aaa",
                23
        };
    
        printf("name -> %s
    ", student.name);
    
    //    student.name[0] = 'A'; 不允许这样操作,aaa是字符串常量,无法被修改
    
        printf("name -> %s
    ", student.name);
    }
    void test2() {
        struct Student student = {
                12003,
                NULL,
                23
        };
    
        student.name = malloc(sizeof(char) * 64); // 结构体属性值创建在malloc堆区中
        strcpy(student.name, "Jerry");
        printf("name -> %s
    ", student.name);
    
        strcpy(student.name, "Tom");
        printf("name -> %s
    ", student.name);
    }
    
    void customFree(void * pointer) {
        if (pointer != NULL) {
            free(pointer);
            pointer = NULL;
        }
    }
    
    void test3() {
        // 结构体本身和属性成员都在堆区中创建
        struct Student * studentPointer = NULL;
        studentPointer = malloc(sizeof(struct Student));
    
        studentPointer -> id = 1002001;
        studentPointer -> name = "Ach";
        studentPointer -> age = 22;
        printf("id - %d, name - %s, age - %d
    ", studentPointer->id, studentPointer->name, studentPointer->age);
    
        customFree(&studentPointer->id);
        customFree(studentPointer->name);
        customFree(&studentPointer->age);
    
        printf("id - %d, name - %s, age - %d
    ", studentPointer->id, studentPointer->name, studentPointer->age);
    
    }
    
    int main() {
        test3();
        return 0;
    }

    四、Const与结构体:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct Student {
        int id;
        char * name;
        int age;
    };
    
    void sss() {
        struct Student s1 = {
                100,
                "Tom",
                18
        };
    
        struct Student const * p1 = &s1; // 常量指针,指针指向的内存空间不可以改变存储值,但是改变指向
        struct Student * const p2 = &s1; // 指针常量,指向不可以改变,但是可以改变指向的内存空间存储值
        struct Student const * const p3 = &s1; // 常量锁定,不可以操作任何的写入了
    }
    
    int main() {
        sss();
        return 0;
    }
  • 相关阅读:
    K210识别水果模型
    一键开关机短路
    Arudino IDE添加STM32官方管理器stm32duino / Arduino_Core_STM32
    ESP32 Ble
    Blynk软件配置及Mixly编程教程
    Laravel安装及配置,完成基础的demo
    electron下载/打包慢?解决办法.....
    ESP32+PHP+MYSQL 搭建自己的物联网平台Demo
    PCA9536读写测试之MicroPython
    MSF实验2
  • 原文地址:https://www.cnblogs.com/mindzone/p/13957103.html
Copyright © 2011-2022 走看看