1-6 结构体(struct)和联合体(union)的概念及使用(超详细)

本节重点讲述结构体(struct)和联合体(union)的概念及使用,如果想详细了解关键字的同学点击下方链接进行跳转

C语言从入门到精通应该怎么学?-CSDN博客

1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客

1-2 C语言 - 控制语句关键字-CSDN博客

1-3 C语言 - 控制语句的使用注意事项(这些绝对是您经常出错的地方)-CSDN博客

1-4 C语言 - 存储类别关键字及其使用(超详细)-CSDN博客

1-5 C语言 - 类型修饰符关键字const和volatile的概念及使用(超详细)-CSDN博客

目录

结构体(struct)

联合体(union)

结构体与联合体的比较

示例代码


在C语言中,struct(结构体)和union(联合体)是两种用于定义自定义数据类型的关键字。它们允许将不同类型的数据组合在一起,以便在程序中更方便地使用和管理。

结构体(struct)

概念: 结构体是一种聚合数据类型,可以将多个不同类型的变量组合在一起。每个变量在结构体中称为成员。结构体成员在内存中是按顺序存储的,并且每个成员都有自己的内存空间。

定义和使用:

  1. 定义结构体类型:

    struct Person {
        char name[50];
        int age;
        float height;
    };
    
  2. 声明结构体变量:

    struct Person person1;
    struct Person person2 = {"Alice", 30, 5.5};
    
  3. 访问结构体成员:

    person1.age = 25;
    strcpy(person1.name, "JiaoY");
    person1.height = 6.0;
    
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Height: %.1f\n", person1.height);
    
  4. 通过指针访问结构体成员:

    struct Person *ptr = &person1;
    ptr->age = 26;
    printf("Age: %d\n", ptr->age);
    

内存布局: 在结构体中,每个成员都有自己的存储空间,成员按其声明的顺序在内存中依次存储。这可能会导致内存对齐和填充问题,影响内存利用率。

联合体(union)

概念: 联合体是一种数据结构,允许将不同类型的数据存储在同一内存位置。也就是说,联合体的所有成员共享同一块内存,任何时候只能存储一个成员的值。

定义和使用:

  1. 定义联合体类型:

    union Data {
        int i;
        float f;
        char str[20];
    };
    
  2. 声明联合体变量:

    union Data data;
    
  3. 访问联合体成员:

    data.i = 10;
    printf("data.i: %d\n", data.i);
    
    data.f = 220.5;
    printf("data.f: %.1f\n", data.f);
    
    strcpy(data.str, "C Programming");
    printf("data.str: %s\n", data.str);
    

内存布局: 联合体的大小由其最大成员决定,因为所有成员共用同一块内存空间。当一个成员被赋值时,其他成员的值会被覆盖。

注意事项:

  • 使用联合体时,必须确保只在适当的成员上执行适当的操作,否则可能会导致数据混乱。
  • 联合体常用于节省内存的情况,例如在实现多态数据结构时(如一个节点可能包含不同类型的数据)。

600

结构体与联合体的比较

  • 内存使用:

    • 结构体:每个成员都有自己的内存空间,结构体的总大小是所有成员大小的总和。
    • 联合体:所有成员共享同一块内存,联合体的大小是其最大成员的大小。
  • 成员访问:

    • 结构体:可以同时访问所有成员。
    • 联合体:任一时刻只能访问一个成员。
  • 用途:

    • 结构体:适用于需要组合多个不同类型数据的情况。
    • 联合体:适用于需要在不同类型数据之间共享内存的情况。

示例代码

结构体示例

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

// 定义结构体类型Person
struct Person {
    char name[50];  // 姓名,字符数组
    int age;        // 年龄,整数
    float height;   // 身高,浮点数
};

int main() {
    struct Person person1;  // 声明结构体变量person1

    // 赋值给person1的成员
    strcpy(person1.name, "jiaoy");  // 设置姓名为jiaoy
    person1.age = 30;               // 设置年龄为30
    person1.height = 5.5;           // 设置身高为5.5

    // 输出结构体成员的值
    printf("Name: %s\n", person1.name);  // 输出姓名
    printf("Age: %d\n", person1.age);    // 输出年龄
    printf("Height: %.1f\n", person1.height);  // 输出身高

    return 0;  // 程序结束
}
  • 结构体Person包含三个成员:name(字符数组)、age(整数)和height(浮点数)。
  • main函数中,声明了一个结构体变量person1
  • 使用strcpy函数将字符串"jiaoy"复制到person1name成员。
  • 将整数30赋值给person1age成员。
  • 将浮点数5.5赋值给person1height成员。
  • 最后,通过printf函数输出person1的成员值。

联合体示例

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

// 定义联合体类型Data
union Data {
    int i;        // 整数类型
    float f;      // 浮点数类型
    char str[20]; // 字符数组类型
};

int main() {
    union Data data;  // 声明联合体变量data

    data.i = 10;  // 给联合体成员i赋值
    printf("data.i: %d\n", data.i);  // 输出整数成员i的值

    data.f = 220.5;  // 给联合体成员f赋值
    printf("data.f: %.1f\n", data.f);  // 输出浮点数成员f的值

    strcpy(data.str, "C Programming");  // 给联合体成员str赋值
    printf("data.str: %s\n", data.str);  // 输出字符数组成员str的值

    return 0;  // 程序结束
}
  • 联合体Data包含三个成员:i(整数)、f(浮点数)和str(字符数组)。
  • main函数中,声明了一个联合体变量data
  • 依次给dataifstr成员赋值,并使用printf函数输出每个成员的值。
  • 由于联合体的所有成员共享同一块内存,因此每次赋值后,之前的值会被覆盖。
  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 结构体struct)和联合体union)都是C语言中用于定义自定义数据类型的方式,它们的区别在于: 1. 结构体中的各个成员在内存中是分开存储的,而联合体中的各个成员在内存中是共用同一块空间的。 2. 结构体的大小至少是其各个成员大小之和,因为每个成员都需要占用一定的内存空间,而联合体的大小则是其最大成员的大小,因为联合体中只有一个成员会被使用,其它成员则会被浪费。 3. 结构体中的各个成员可以同时被访问和修改,而联合体中只有一个成员可以被访问和修改。 4. 结构体可以存储不同类型的成员,而联合体只能存储同一类型的成员。 总之,结构体适合用于存储多个不同类型的数据,而联合体适合用于存储多个相同类型的数据,且只有一个数据会被使用的情况。 ### 回答2: 结构体struct联合体union都是在C语言中用来组织多个不同类型的变量的一种方式。它们的区别在于变量的存储方式和内存占用。 结构体struct是一种可以存储不同类型的变量的自定义数据类型。它通过定义多个不同类型的变量,并将它们组合在一起,形成一个新的类型。结构体中的每个成员变量都使用独立的内存空间,大小根据成员变量的类型而定。结构体的成员可以同时存在于内存中,因此结构体可以存储和处理多个不同类型的数据。 联合体union也是一种可以存储不同类型的变量的自定义数据类型。它与结构体不同的是,联合体的成员变量共享同一块内存空间,也就是说,联合体的各个成员变量会在同一时间占用该内存空间。联合体的内存空间大小会根据最大的成员变量类型来决定。而为了节约内存空间,联合体只能同时存储和处理一个成员的数据。 结构体联合体使用方式也不同。结构体通常用于组织多个相关的变量,可以同时访问和修改结构体的各个成员变量。而联合体通常用于存储不同类型的变量,根据不同的需求来访问和修改特定的成员变量。 综上所述,结构体联合体在存储方式、内存占用和使用方式上都有所不同,开发者要根据实际需求选择合适的数据类型。 ### 回答3: 结构体struct联合体unionC语言中的两种复合数据类型。 结构体struct允许将不同类型的变量(如整型、字符型、浮点型等)组合在一起,形成一个逻辑上的整体。它可以定义多个成员变量,每个成员变量可以有不同的数据类型和名称。通过使用结构体,可以更方便地管理和操作相关的数据。 而联合体union也是用来组合不同类型的变量,不同于结构体的是,联合体的所有成员变量都共享同一块内存空间。联合体的大小取决于成员变量中占用内存空间最大的数据类型。只能同时使用其中的一个成员变量,存取一个成员变量会覆盖之前存入的值。通过使用联合体,可以节省内存空间,但在数据使用时需要小心,确保不会出现意外的数据覆盖。 总结来说,结构体struct联合体union的区别是: 1. 结构体允许不同类型的成员变量,而联合体中的成员变量必须是相同的类型。 2. 结构体的成员变量占用不同的内存空间,联合体的成员变量共享同一块内存空间。 3. 结构体的大小等于所有成员变量所占内存空间的总和,联合体的大小等于最大的成员变量所占内存空间。 4. 结构体的所有成员变量可以同时使用,而联合体只能同时使用一个成员变量。 5. 结构体适用于存储和操作不同类型的相关数据,联合体适用于节省内存空间、只需存取其中一个成员变量的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值