zoukankan      html  css  js  c++  java
  • C语言学习笔记-结构体

    • 结构体的类型和定义

    • 结构体的赋值

    • 结构体的数组

    • 结构体嵌套一级指针

    • 结构体嵌套二级指针
    • 结构体作为函数参数
    • 结构体深拷贝、浅拷贝

    结构体的类型和定义

    结构体是一种数据类型,用 struct 关键字来修饰,定义一个结构体可以这样:

    1
    2
    3
    4
    5
    
    struct Teacher
    {
        char name[50];
        int age;
    }
    

    如果用 typedef 修饰,就可以直接使用 Teacher

    1
    2
    3
    4
    5
    6
    7
    
    typedef struct Teacher
    {
        char name[50];
        int age;
    }
    
    Teacher teacher = NULL;
    

    为结构体申明变量有多种方式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    // 初始化结构体变量1: 定义类型的同时定义变量
    struct Teacher
    {
        char name[50];
        int age;
    }t1, t2;
    
    // 初始化结构体变量2
    struct Student
    {
        char name[50];
        int age;
    }s1 = {"Mike", 15}; 
    
    // 初始化结构体变量3
    struct
    {
        char name[50];
        int age;
    }dog = {"Luck", 3}; 
    
    // 初始化结构体变量4
    struct Teacher t3 = {"Mary", 21};
    
    // 初始化结构体变量5
    struct Teacher t4;
    struct Teacher *pTeacher = NULL;
    pTeacher = &t4;
    
    strcpy(pTeacher->name, "John");
    pTeacher->age = 30;
    

    结构体的赋值

    结构体赋值之前要先给结构体申请内存。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    /* 结构体赋值 */
    
    #include <stdio.h>
    #include <string.h>
    
    struct Teacher
    {
        char name[50];
        int age;
    };
    
    typedef struct Teacher teacher_t;
    
    void show_teacher(teacher_t t);
    void copyTeacher(teacher_t *to, teacher_t *from);
    
    int main()
    {
        teacher_t t1, t2, t3;
    
        // 结构体是一种数据类型,分配空间之后才能赋值
        memset(&t1, 0, sizeof(t1));
        strcpy(t1.name, "teacher");
        t1.age = 30;
    
        show_teacher(t1);
    
        // 直接赋值
        t2 = t1;
        show_teacher(t2);
    
        // 作为参数传递到用于拷贝的函数
        copyTeacher(&t3, &t1);
        show_teacher(t3);
    
        return 0;
    }
    
    void copyTeacher(teacher_t *to, teacher_t *from)
    {
        *to = *from;
    }
    
    void show_teacher(teacher_t t)
    {
        printf("teacher name = %s
    ", t.name);
        printf("teacher age = %d
    ", t.age);
    }
    

    结构体的数组

    指针数组可以分成静态结构体数组和动态结构体数组两种。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    // 静态结构体数组
    Teacher t1[3] = {"a", 18, "a", 28, "a", 38};
    for(int i = 0; i < 3; i++)
    {
    	printf("%s, %d
    ", t1[i].name, t1[i].age);
    }
    
    // 动态结构体数组
    Teacher *p = NULL;
    p = (Teacher *)malloc(3 * sizeof(Teacher));
    
    char buf[50];
    for(int i = 0; i < 3; i++)
    {
    	sprintf(buf, "name%d", i);
    	strcpy(p[i].name, buf);
    	p[i].age = 20 + i;
    }
    

    结构体数组

    结构体嵌套指针

    我们在定义结构体的时候,其中有一个属性使用了一级指针:

    1
    2
    3
    4
    5
    
    struct Teacher
    {
        char *name;
        int age;
    };
    

    如上所示char *name是一个指针类型的变量,指针类型的变量当我们为其赋值时要分配内存空间,释放结构体的时候也要先释放其中指针内存的变量。

    示例代码,结构体嵌套一级指针

    示例代码,结构体嵌套二级指针

    结构体深拷贝、浅拷贝

    当结构体中嵌套了指针,采用浅拷贝的方式如下

    1
    2
    3
    4
    5
    6
    7
    8
    
    Student stu;
    stu.name = (char *)malloc(30);
    strcpy(stu.name, "aaaaaa");
    
    // 浅拷贝,stu 和 sut2 的name 指针指向同一块内存
    Student stu2;
    stu2 = stu;
    printf("name = %s
    ", stu2.name);
    

    此时 stu.name 和 stu2.name 指向同一块内存空间,当释放其中一个指针的时候,另一个 name 的值也就消失了。

    深拷贝的方式指的就是 stu2.name 指向一块新的内存空间,这块内存空间拷贝 stu.name 指向的空间的内容,就像下面这样。

    1
    2
    3
    4
    5
    
    // 深拷贝,stu3 重新申请一块内存
    Student stu3;
    stu3.name = (char *)malloc(30);
    strcpy(stu3.name, stu.name);
    printf("name = %s
    ", stu3.name);
    

    示例代码,结构体的深拷贝和浅拷贝

  • 相关阅读:
    [TJOI2018]教科书般的亵渎
    luogu P4781 【模板】拉格朗日插值
    [SDOI2010]捉迷藏
    [CQOI2016]K远点对
    BZOJ4066 简单题
    [国家集训队]JZPFAR
    Understanding User and Kernel Mode
    Linux下如何查看系统启动时间和运行时间以及安装时间
    CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址、服务启动等)
    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185159.html
Copyright © 2011-2022 走看看