C小程序—结构体定义、初始化、引用、结构体做函数参数、结构体数组、结构体中套一级/二级指针、结构体深copy和浅copy

1.结构体

(1)定义结构体

struct Teacher
{
    char name[64];
    int age;
    int id;
};
void main()
{
    struct Teacher  t1; //告诉C编译器给我分配内存
    printf("hello...\n");
    system("pause");
    return;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

(2)定义变量的三种方法

//用类型定义变量
typedef struct Teacher
{
    char name[64];
    int age;
    int id;
}Teacher;

//定义类型的同时 定义变量
struct Student
{
    char name[64];
    int aga ;
}s1, s2 ;  

//匿名类型 定义变量
struct 
{
    char name[64];
    int aga ;
}s3, s4;  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

(3)初始化变量的三种方法

//定义变量 ,然后初始化
Teacher  t1 = {"aaaa", 31, 01};

struct Student
{
    char name[64];
    int aga ;
}s5 = {"names", 21};

struct 
{
    char name[64];
    int aga ;
}s6 = {"names", 21};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(4)变量的引用

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct Teacher
{
    char name[64];
    int age;
    int id;
}Teacher;

void main()
{
    Teacher  t1; //告诉C编译器给我分配内存
    Teacher  t2 = { "aaaa", 32, 02 };
    t1.age = 31; //t1.操作符是寻址操作 计算age相对于t1大变量的偏移量
    strcpy(t1.name, "t1name");
    printf("t1.name:%s \n", t1.name);

    //通过指针的方式操作内存空间
    {
        Teacher *p = NULL;
        p = &t2;
        printf("p->age:%d \n", p->age); //->  是寻址操作 算age相对于t2大变量的偏移量
        printf("p->name:%s \n", p->name);
    }

    printf("hello...\n");
    system("pause");
    return;
}
  • 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

这里写图片描述

(5)结构体做函数参数

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct Teacher
{
    char name[64];
    int age;
    int id;
}Teacher;


void  copyTeacher01(Teacher to, Teacher from)
{
    to = from;
}

void  copyTeacher02(Teacher *to, Teacher *from)
{
    //(*to) = (*from);
    *to = *from;
}

void main()
{
    Teacher  t1 = { "aaaa", 32, 02 };
    Teacher  t2;
    Teacher  t3;
    memset(&t3, 0, sizeof(t3));

    t2 = t1; //=号操作下编译器的行为
    //编译器给我们提供简单=号赋值操作
    printf("t2.name:%s \n", t2.name);
    printf("t2.age:%d \n", t2.age);

    copyTeacher01(t3, t1);
    printf("copyTeacher01() after \n");
    printf("t3.name:%s \n", t3.name);
    printf("t3.age:%d \n", t3.age);
    printf("\n");

    copyTeacher02(&t3, &t1);
    printf("copyTeacher02() after \n");
    printf("t3.name:%s \n", t3.name);
    printf("t3.age:%d \n", t3.age);
    printf("\n");
    system("pause");
    return;
}
  • 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
  • 49
  • 50
  • 51

这里写图片描述

这里写图片描述

(6)结构体数组

结构体数组,输入老师的年龄,排序(通过数组操作)

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct Teacher
{
    char name[64];
    int age;
    int id;
}Teacher;

void printTeacher(Teacher *array, int num)
{
    int i = 0;

    for (i = 0; i < num; i++)
    {
        printf("age:%d \n", array[i].age);
    }
}

void sortTeacer(Teacher *array, int num)
{
    int     i, j;
    Teacher tmp;

    for (i = 0; i < num; i++)
    {
        for (j = i + 1; j<num; j++)
        {
            if (array[i].age > array[j].age)
            {
                tmp = array[i];  //=号操作  赋值操作
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}

// 结构体数组 输入老师的年龄,排序
void main()
{
    int         i = 0;
    Teacher     Array[3];  
    int         num = 3;

    for (i = 0; i < num; i++)
    {
        printf("\nplease enter age:");
        scanf("%d", &(Array[i].age));
    }

    printTeacher(Array, num);

    sortTeacer(Array, num);

    printf("排序之后\n");

    printTeacher(Array, num);

    printf("hello...\n");
    system("pause");
    return;
}
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

这里写图片描述

结构体数组,输入老师的年龄,排序(通过指针操作)

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct Teacher
{
    char name[64];
    int age;
    int id;
}Teacher;

void printTeacher(Teacher *array, int num)
{
    int i = 0;

    for (i = 0; i < num; i++)
    {
        printf("age:%d \n", array[i].age);
    }
}

void sortTeacer(Teacher *array, int num)
{
    int     i, j;
    Teacher tmp;

    for (i = 0; i < num; i++)
    {
        for (j = i + 1; j<num; j++)
        {
            if (array[i].age > array[j].age)
            {
                tmp = array[i]; 
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}
Teacher * createTeacher(int num)
{
    Teacher * tmp = NULL;
    tmp = (Teacher *)malloc(sizeof(Teacher)* num); //相当于Teacher Array[3]
    if (tmp == NULL)
    {
        return NULL;
    }
    return tmp; 

}

void FreeTeacher(Teacher *p)
{
    if (p != NULL)
    {
        free(p);
    }
}

void main()
{
    int         i = 0;
    int         num = 3;
    Teacher *pArray = NULL;
    pArray = createTeacher(num);

    for (i = 0; i < num; i++)
    {
        printf("\nplease enter age:");
        scanf("%d", &(pArray[i].age));
    }
    printTeacher(pArray, num);

    sortTeacer(pArray, num);

    printf("排序之后\n");

    printTeacher(pArray, num);

    FreeTeacher(pArray);

    printf("hello...\n");
    system("pause");
    return;
}
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

这里写图片描述

(7)结构体中套一级指针

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct Teacher
{
    char name[64];
    char *alisname;//一级指针
    int age ;
    int id;
}Teacher;

void printTeacher(Teacher *array, int num)
{
    int i = 0;

    for (i=0; i<num; i++)
    {
        printf("age:%d \n", array[i].age);
    }
}

void sortTeacer(Teacher *array, int num)
{
    int     i,j;
    Teacher tmp;

    for (i=0; i<num; i++)
    {
        for (j=i+1; j<num; j++)
        {
            if (array[i].age > array[j].age)
            {
                tmp = array[i];  //=号操作  赋值操作
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}


int createTeacher(Teacher **pT, int num)
{
    int i = 0;
    Teacher * tmp = NULL;
    tmp = (Teacher *)malloc(sizeof(Teacher) * num); //  Teacher     Array[3]
    if (tmp == NULL)
    {
        return -1;
    }
    memset(tmp, 0, sizeof(Teacher) * num);

    for (i=0; i<num; i++)
    {
        tmp[i].alisname = (char *)malloc(60);
    }

    *pT = tmp;  //二级指针形参 去间接的修改 实参 的值 
    return 0; //
}

//释放内存
void FreeTeacher(Teacher *p, int num)
{
    int i = 0;
    if (p == NULL)
    {
        return;
    }
    for (i=0; i<num; i++)
    {
        if (p[i].alisname != NULL)
        {
            free(p[i].alisname);
        }
    }
    free(p);
}

void main()
{
    int         ret = 0;
    int         i = 0;
    int         num = 3;
    Teacher *pArray = NULL;
    ret = createTeacher(&pArray, num);
    if (ret != 0)
    {
        printf("func createTeacher() er:%d \n ", ret);
        return ret;
    }

    for (i=0; i<num; i++)
    {
        printf("\nplease enter age:");
        scanf("%d", & (pArray[i].age) );

        printf("\nplease enter name:");
        scanf("%s",  pArray[i].name ); //向指针所指的内存空间copy数据

        printf("\nplease enter alias:");
        scanf("%s",  pArray[i].alisname ); //向指针所指的内存空间copy数据
    }

    printTeacher(pArray, num);

    sortTeacer(pArray, num);

    printf("排序之后\n");

    printTeacher(pArray, num);

    FreeTeacher(pArray, num);

    printf("hello...\n");
    system("pause");
    return ;
}
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121

这里写图片描述

这里写图片描述

(8)结构体中套一级、二级指针

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct Teacher
{
    char name[64];
    char *alisname; //一级指针
    char **stuname; //二级指针
    int age;
    int id;
}Teacher;

void printTeacher(Teacher *array, int num)
{
    int i = 0;

    for (i = 0; i < num; i++)
    {
        printf("age:%d \n", array[i].age);
    }
}

void sortTeacer(Teacher *array, int num)
{
    int     i, j;
    Teacher tmp;

    for (i = 0; i < num; i++)
    {
        for (j = i + 1; j<num; j++)
        {
            if (array[i].age > array[j].age)
            {
                tmp = array[i];  //=号操作  赋值操作
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}

int createTeacher(Teacher **pT, int num)
{
    int i = 0, j = 0;
    Teacher * tmp = NULL;
    tmp = (Teacher *)malloc(sizeof(Teacher)* num); //   Teacher     Array[3]
    if (tmp == NULL)
    {
        return -1;
    }
    memset(tmp, 0, sizeof(Teacher)* num);

    for (i = 0; i < num; i++)
    {
        char **p = NULL;

        //malloc一级指针
        tmp[i].alisname = (char *)malloc(60);

        //二级指针的第三种内存模型
        p = (char **)malloc(3 * sizeof(char *));  //打造二维内存
        for (j = 0; j < 3; j++)
        {
            p[j] = (char *)malloc(120);
        }
        tmp[i].stuname = p; 

    }

    *pT = tmp;  //二级指针 形参 去间接的修改 实参 的值 
    return 0; //
}

void FreeTeacher(Teacher *p, int num)
{
    int i = 0, j = 0;
    if (p == NULL)
    {
        return;
    }
    for (i = 0; i < num; i++)
    {
        //释放一级指针
        if (p[i].alisname != NULL)
        {
            free(p[i].alisname);
        }

        //释放二级指针
        if (p[i].stuname != NULL)
        {
            char **myp = p[i].stuname;
            for (j = 0; j < 3; j++)
            {
                if (myp[j] != NULL)
                {
                    free(myp[j]);
                }
            }
            free(myp);
            p[i].stuname = NULL;
        }
    }
    free(p);
}

void main()
{
    int         ret = 0;
    int         i = 0, j = 0;
    int         num = 3;
    Teacher *pArray = NULL;
    ret = createTeacher(&pArray, num);
    if (ret != 0)
    {
        printf("func createTeacher() er:%d \n ", ret);
        return;
    }

    for (i = 0; i < num; i++)
    {
        printf("\nplease enter age:");
        scanf("%d", &(pArray[i].age));

        printf("\nplease enter alias:");
        scanf("%s", pArray[i].alisname);  //向指针所指的内存空间copy数据

        for (j = 0; j < 3; j++)
        {
            printf("please enter student name:");
            scanf("%s", pArray[i].stuname[j]);
        }
    }
    printTeacher(pArray, num);

    sortTeacer(pArray, num);

    printf("排序之后\n");

    printTeacher(pArray, num);

    FreeTeacher(pArray, num);

    printf("hello...\n");
    system("pause");
    return;
}
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150

这里写图片描述

这里写图片描述

2.结构体的深copy和浅copy

(1)代码

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//结构体定义下来,则结构体中的成员的内存布局就定下了。
typedef struct Teacher
{
    char name[64];
    int age ;
    char *pname2;//一级指针

}Teacher;


//编译器的=号操作,只会把指针变量的值,从from  copy 到 to,但 
//不会把指针变量所指的内存空间给copy过去..//浅copy

void copyTeacher(Teacher *to, Teacher *from)
{
    *to = *from;
    //如果想深copy,再执行内存分配
    to->pname2 = (char *)malloc(100);
    strcpy(to->pname2, from->pname2);
}
void main()
{
    Teacher t1;
    Teacher t2;

    strcpy(t1.name, "name1");
    t1.pname2 = (char *)malloc(100);
    strcpy(t1.pname2, "ssss");

    //t1 复制给 t2
    copyTeacher(&t2, &t1);

    printf("释放前pname2:%s\n", t2.pname2);

    if (t1.pname2 != NULL)
    {
        free(t1.pname2);
        t1.pname2 = NULL;
    }

    if (t2.pname2 != NULL)
    {
        free(t2.pname2);
        t2.pname2 = NULL;
    }
    printf("释放后pname2:%s\n", t2.pname2);
    printf("hello...\n");
    system("pause");
    return ;
}
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

(2)内存图

这里写图片描述

(3)运行结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/lanlan1266/article/details/80227552