C语言:结构体和共用体

一.简述

结构体和共用体是C语言中两种重要的用户自定义数据类型,用于将不同类型的数据组合在一起。它们在内存布局、用途和访问方式上都有显著的区别和一些相似点。以下是详细的介绍:

Ⅰ结构体

定义

struct Example {

    int a;

    float b;

    char c;

};

①内存布局

结构体中的每个成员都有自己的内存空间,且各成员在内存中是按顺序排列的。每个成员都有自己的地址,结构体的总大小是所有成员大小的总和(可能加上一些填充字节以满足内存对齐要求)。

②使用场景

结构体适用于需要将多种类型的数据组合在一起并且需要同时访问它们的场景。例如,在表示一个点(有x和y坐标)或一个学生的信息(有名字、年龄、成绩等)时,可以使用结构体。

③访问方式

通过结构体变量和成员名访问结构体中的成员。例如:

struct Example example;

example.a = 10;

example.b = 20.5;

example.c = 'c';

Ⅱ共用体

定义

union Example {

    int a;

    float b;

    char c;

};

①内存布局

共用体中的所有成员共享同一段内存。这意味着在任一时刻,只有一个成员能有效地存储数据。共用体的总大小是其最大成员的大小

②使用场景

共用体适用于节省内存的场景,尤其是当需要在不同时间存储不同类型的数据时。例如,在处理多个数据类型但同时只需要一个有效的值时,可以使用共用体。

③访问方式

通过共用体变量和成员名访问共用体中的成员。例如:

union Example example;

example.a = 10; // 使用example.a

example.b = 20.5; // 此时example.a的值将不再有效,因为它们共享同一段内存

二.异同总结

①相似点

语法:两者的定义和成员访问方式类似。

用途:都用于将不同类型的数据组合在一起。

②不同点

(1)内存分配:

结构体:每个成员有独立的内存空间,总大小是所有成员大小之和

共用体:所有成员共享同一段内存,总大小是最大成员的大小。

(2)访问方式:

结构体:可以同时访问所有成员。

共用体:在任一时刻只能有效访问一个成员,访问其他成员会导致未定义行为。

(3)数据有效性:

结构体:所有成员的数据始终有效互不影响

共用体:每次只能有效存储一个成员的数据,写入一个成员会覆盖其他成员的数据。

(4)用途:

结构体:用于逻辑上相关的多种数据类型的组合,且需要同时访问这些数据。

共用体:用于节省内存或在不同时间段存储不同类型的数据。

三.示例

①结构体示例:

#include <stdio.h>

struct Point {

    int x;

    int y;

};

int main() {

    struct Point p;

    p.x = 10;

    p.y = 20;

    printf("Point coordinates: (%d, %d)\n", p.x, p.y);

    return 0;

}

②共用体示例:

#include <stdio.h>

union Data {

    int i;

    float f;

    char str[20];

};

int main() {

    union Data data;

    data.i = 10;

    printf("data.i: %d\n", data.i);

    data.f = 220.5;

    printf("data.f: %f\n", data.f);

    strcpy(data.str, "C Programming");

    printf("data.str: %s\n", data.str);

    return 0;

}

(注:代码中,虽然使用了共用体,但代码未能展示共用体在任一时刻只能有效访问一个成员的特性。这是因为每次给一个成员赋值后,立刻打印它的值,然后再给另一个成员赋值。这种情况下,每次打印的都是刚赋值的成员,所以没有展示出覆盖问题。

通过以上的介绍和示例,可以清晰地看到结构体和共用体在定义、内存布局、使用场景和访问方式上的异同。

  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值