美文网首页
结构体的基本操作

结构体的基本操作

作者: arkliu | 来源:发表于2022-10-08 19:38 被阅读0次

结构体定义和初始化

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

// 1. 结构体类型的定义
//struct关键字
//struct Teacher合在一起才是类型
struct Teacher
{
    char name[50];
    int age;
};

//3. 定义类型的同时,定义变量
struct Student
{
    char name[50];
    int age;
}st1, st2;

// 5. 通过typedef改类型名字
typedef struct People {
    char name[50];
    int age;
} People;

int main() {
    // 2. 结构体变量的声明
    struct Teacher teacher;

    // 4.结构体变量初始化
    // 4.1定义变量时候直接初始化,通过{}
    struct Teacher teacher1 = {"zhangsan", 22};
    printf("name = %s  age = %d\n", teacher1.name, teacher1.age); //name = zhangsan  age = 22

    People people;
    strcpy(people.name, "wangwu");
    people.age = 34;
    printf("name = %s  age = %d\n", people.name, people.age);

    struct Teacher * teacher2 = malloc(sizeof(struct Teacher));
    strcpy(teacher2->name, "wangwu");
    teacher2->age = 34;
    printf("name = %s  age = %d\n", teacher2->name, teacher2->age);
   
}

结构体变量相互赋值

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

typedef struct People {
    char name[50];
    int age;
} People;

void copyPeople(People *dest, People source) {
    dest->age = source.age;
    strcpy(dest->name,source.name);
}

int main() {
    People people = {"李四", 23};
    //相同类型的两个结构体变量可以相互赋值
    //把people成员变量内存的值拷贝到people2成员变量的内存
    People people2 = people;
    printf("name = %s  age = %d\n", people2.name, people2.age);
   
    People p3;
    memset(&p3, 0, sizeof(p3));
    copyPeople(&p3, people);
    printf("name = %s  age = %d\n", p3.name, p3.age);
}

结构体数组

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

typedef struct People {
    char name[50];
    int age;
} People;

int main() {
    People p[3] = {
        {"abc", 22},
        {"def", 33},
        {"ghi", 44}
    };
    //静态
    People p2[3] = {"abc", 22,"def", 33,"ghi", 44};
    for (size_t i = 0; i < 3; i++)
    {
        printf("name = %s  age = %d\n", p2[i].name, p2[i].age);
    }
    
    //动态
    People * p3 = malloc(3 * sizeof(People));
    char buf[128];
    for (size_t i = 0; i < 3; i++)
    {
        sprintf(buf, "name%d%d", i, i);
        strcpy(p3[i].name, buf);
        p3[i].age = i;
    }

    for (size_t i = 0; i < 3; i++)
    {
        printf("name = %s  age = %d\n", p3[i].name, p3[i].age);
    }
    if (p3 != NULL)
    {
        free(p3);
        p3 = NULL;
    }
}

结构体嵌套一级指针

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

typedef struct People {
    char * name;
    int age;
} People;

int main() {
    People p1;
    p1.age = 22;
    p1.name = (char *)malloc(30 * sizeof(char));
    strcpy(p1.name, "张三");
    printf("p1 name = %s age = %d\n", p1.name, p1.age); //p1 name = 张三 age = 22
    if (p1.name != NULL)
    {
        free(p1.name);
        p1.name = NULL;
    }


    People * p2;
    p2 = (People *)malloc(sizeof(People));
    p2->age = 33;
    p2->name = (char *)malloc(30 * sizeof(char));
    strcpy(p2->name, "李四");
    printf("p2 name = %s age = %d\n", p2->name, p2->age);
    if (p2->name != NULL)
    {
        free(p2->name);
        p2->name = NULL;
    }
    if (p2 != NULL)
    {
        free(p2);
        p2 = NULL;
    }
    
    
    People * p3;
    p3 = (People *)malloc(sizeof(People) * 3);
    char buf[128];
    for (size_t i = 0; i < 3; i++)
    {
        p3[i].age = i;
        p3[i].name = malloc(sizeof(char) * 30);
        sprintf(buf, "name %d %d", i, i);
        strcpy(p3[i].name, buf);
    }
    for (size_t i = 0; i < 3; i++)
    {
        printf("p3 name = %s  age = %d\n", p3[i].name, p3[i].age);
    }
    for (size_t i = 0; i < 3; i++)
    {
        if (p3[i].name != NULL)
        {
            free(p3[i].name);
            p3[i].name = NULL;
        }
    }
    if (p3 != NULL)
    {
        free(p3);
        p3 = NULL;
    } 
}

结构体嵌套二级指针

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STU_SIZE 3

//一个老师对应多个学生
typedef struct Teacher {
    char ** stu;
} Teacher;

int main() {
    // init
    Teacher t1;
    t1.stu = (char **)malloc(sizeof(char *) * STU_SIZE);
    char buf[128];
    for (size_t i = 0; i < STU_SIZE; i++)
    {
        t1.stu[i] = (char *)malloc(sizeof(char) * 30);
        sprintf(buf, "name %d%d", i,i);
        strcpy(t1.stu[i], buf);
    }
    // print
    for (size_t i = 0; i < STU_SIZE; i++)
    {
        printf("name = %s\n", t1.stu[i]);
    }

    //free
    for (size_t i = 0; i < STU_SIZE; i++)
    {
        if (t1.stu[i] != NULL)
        {
            free(t1.stu[i]);
            t1.stu[i] = NULL;
        }
    }
    if (t1.stu != NULL)
    {
        free(t1.stu);
        t1.stu = NULL;
    }

    // init
    Teacher * t2;
    t2 = (Teacher *)malloc(sizeof(Teacher));
    t2->stu = (char **)malloc(sizeof(char *) * STU_SIZE);
    for (size_t i = 0; i < STU_SIZE; i++)
    {
        t2->stu[i] = (char *)malloc(sizeof(char) * 30);
        sprintf(buf, "name %d%d", i,i);
        strcpy(t2->stu[i], buf);
    }
    // print
    for (size_t i = 0; i < STU_SIZE; i++)
    {
        printf("name = %s\n", t2->stu[i]);
    }
    // free
    for (size_t i = 0; i < STU_SIZE; i++)
    {
        if (t2->stu[i] != NULL)
        {
            free(t2->stu[i]);
            t2->stu[i] = NULL;
        }
    }
    if (t2->stu != NULL)
    {
        free(t2->stu);
        t2->stu = NULL;
    }
    if (t2 != NULL)
    {
        free(t2);
        t2 = NULL;
    }
    
    return 0;
}

结构体偏移量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STU_SIZE 3

//结构体类型定义下来,内部的成员变量的内存布局已经确定
typedef struct Teacher {
    char name[64]; // 64
    int age; // 4
    int id; // 4
} Teacher;

int main() {
    Teacher t1;
    Teacher * t2 = NULL;
    t2 = &t1;

    int n1 = (int)(&t2->age) - (int)t2; // 相对于结构体首地址
    printf("n1 = %d\n", n1); // n1 = 64
    
    return 0;
}

联合体

将几种不同类型的变量存放到同一段内存中,这种数据结构称为联合体

  • 联合体重所有成员使用的是内存中的相同位置
  • 联合的长度是它最长成员的长度
  • 联合变量的定义方式和结构体相同,只要将关键字换成union
  • 联合变量初始化必须是联合的第一个成员类型值
#include <stdio.h>

int main() {
    union TestUnion
    {
        int a;
        float b;
        char c;
    } un={10};

    printf("a: %d  b:%f   c: %c", un.a, un.b, un.c);
    un.b = 8.8f;
    printf("a: %d  b:%f   c: %c", un.a, un.b, un.c);
    return 0;
}

相关文章

  • 结构体的基本操作

    结构体定义和初始化 结构体变量相互赋值 结构体数组 结构体嵌套一级指针 结构体嵌套二级指针 结构体偏移量 联合体 ...

  • 线性表

    线性表的基本概念与实现 顺序表和链表的比较 顺序表的结构体定义和基本操作 链表的结构体定义和基本操作 线性表的基本...

  • Mat基本操作

    矩阵基本操作 opencv最基本的结构体是Mat,opencv提供了一系列Mat基本操作加载图片cv::imgre...

  • 结构体运算符重载

    C++中,结构体是无法进行==,>,<,>=,<=,!=操作的,如要使用这些操作符对结构体进行操作,则要在结构体内...

  • Linux字符设备注册

    结构体原型 结构体空间开辟 结构体空间初始化 操作方法集的结构体 机构体注册 字符设备移除 实例

  • 【C语言笔记】<十九>结构体

    结构体的基本概念 结构体初始化 结构体的内存存储细节 结构体定义的方式 结构体类型的作用域 指向结构体的指针 结构...

  • Swift基础语法-结构体,构造函数,(系统结构体)扩充函数,值

    知识点 基本概念 结构体的基本使用 结构体构造器(构造函数/构造方法) 结构体扩充函数(方法), 又称成员方法 结...

  • 结构体训练

    定义类型 初始化 引用"."操作符 是寻址 通过指针来操作 "->"等价于"."操作符 结构体元素 和结构体...

  • Go语言之结构体指针

    结构体本身属于值类型,可以通过指针操作结构体,编程引用类型的数据,通过new()创建指针 结构体指针

  • 12-Go语言结构体

    结构体 结构体的基本概念 什么是结构体Go语言中的结构体几乎和C语言中的结构体一模一样都需要先定义结构体类型, 再...

网友评论

      本文标题:结构体的基本操作

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