Struct和union的理解

这篇具有很好参考价值的文章主要介绍了Struct和union的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结构体(struct)和共用体(union)都是用于组合多个不同类型的数据成员,但它们在内存存储方式和数据访问方式上存在差异。以下是结构体和共用体之间的主要区别:

结构体(struct):

内存布局:结构体的每个成员都分配独立的内存空间,各成员在内存中按照定义的顺序依次排列。

内存占用:结构体的大小等于各成员大小之和,可能会有额外的填充字节以保持对齐。

数据隔离:不同成员之间的数据相互独立,修改一个成员不会影响其他成员。

使用场景:结构体适用于组合和管理多个关联的数据项,每个成员存储不同类型的数据。

共用体(union):

内存布局:共用体的所有成员共享同一块内存空间,不同成员的值使用相同的内存位置。

内存占用:共用体的大小等于最大成员的大小,因为所有成员共享同一块内存。

数据共享:不同成员共享同一块内存,修改一个成员可能会影响其他成员的值。

使用场景:共用体适用于存储不同类型的数据,在不同的情况下只需要访问其中一种类型的数据。

下面举个例子

Struct和union的使用。
Struct 狗
{
Int 白狗;
Int 黑狗;
Int 花狗;
}struct_dog;
这里狗类中,白狗,黑狗,花狗每一种狗都有一个家,都有自己的小窝。
但是共用体就不一样了
union1
{
Int 白狗1;
Int 黑狗1double 花狗1}struct_dog1;
这里的狗类,只有一个家,一个窝,谁要想住窝就得打架,打赢了把那两个狗杀死他就可住了,可以理解为适者生存。每一次的数据更新这里的狗都会进行打架,把其他两个狗杀死。

说白了结构体是有几个成员就分配几次内存地址;共用体是以共用体中的数据占有最大的来分配,比如刚才union狗1的double 占用8个字节,那么这个狗窝就是8个字节,不会是小的,是取最大的。

不知道大家明白了嘛,欢迎交流

代码下面的可以看看

#include <stdio.h>

// 假设共用体中需要保存整数或浮点数
typedef union {
    struct {
        int intValue;
        float floatValue;
    } numericData;

    char stringValue[20]; // 用于保存字符串
} ValueUnion;

int main() {
    ValueUnion value;

    // 设置整数值
    value.numericData.intValue = 42;

    printf("Integer value: %d\n", value.numericData.intValue);

    // 设置浮点数值
    value.numericData.floatValue = 3.14;

    printf("Float value: %.2f\n", value.numericData.floatValue);

    // 设置字符串值
    snprintf(value.stringValue, sizeof(value.stringValue), "Hello, World!");

    printf("String value: %s\n", value.stringValue);
    printf("Float value: %.2f\n", value.numericData.floatValue);
    printf("Integer value: %d\n", value.numericData.intValue);
    return 0;
}

Struct和union的理解,C语言,c语言
但是一般不跟上面这么用,一般在共用体中设置的内存一样大,而不是一大一小。

#include <stdio.h>
#include<iostream>
// 假设共用体中需要保存整数或浮点数
typedef union {
    int a;
    int b; // 用于保存字符串
} ValueUnion;

int main() {
    ValueUnion value;
    value.a = 1;
    value.b = 2;
    std::cout<<value.b<<std::endl;
    return 0;
}

一般这样用, int a; int b; ,实际是一个别名的意思,如果改a的值那么b的值也变了,因为他俩的狗窝一样大,谁后进去算谁的,因为两个家一样大小的。文章来源地址https://www.toymoban.com/news/detail-662813.html

到了这里,关于Struct和union的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解 SQL UNION 运算符及其应用场景

    SQL UNION 运算符用于组合两个或多个 SELECT 语句的结果集。 每个 UNION 中的 SELECT 语句必须具有相同数量的列。 列的数据类型也必须相似。 每个 SELECT 语句中的列也必须按照相同的顺序排列。 UNION语法 UNION ALL语法 UNION 运算符默认仅选择不同的值。为了允许重复的值,请使用 U

    2024年02月05日
    浏览(62)
  • go 语言(九)----struct

    定义一个结构体 结构体使用 结构体传参

    2024年01月20日
    浏览(39)
  • 【C语言】struct结构体

    具有相同或不同类型元素的集合叫做结构体。定义一个结构体,本质是在制作一个类型: 在C中,结构体内只能存放各种类型的变量,不能存函数: 像上面这样就是声明了一个结构体 struct Student ,此时的 struct Student 相当于一个类型名。 然后我们可以用这个自己声明的结构体

    2024年02月03日
    浏览(56)
  • c语言中:struct timespec

    在C语言中, struct timespec 是一个结构体,通常用于处理时间和时间间隔。这个结构体通常包含以下两个成员: tv_sec :这是一个长整型( long ),用于存储秒数。它表示时间的整数部分,即秒数。 tv_nsec :这是一个长整型( long ),用于存储纳秒(nanoseconds)。它表示时间的小

    2024年02月09日
    浏览(43)
  • 【C语言】struct PLUS版~

    ​​​​​​https://blog.csdn.net/weixin_71138261/article/details/126999227?spm=1001.2014.3001.5501  基础版在上面的链接中已经详细解说过了 但是上一次的代码有很严重的问题: 如果我只想要储存两个人的信息,还要开辟100个人的信息吗?没有 如果储存1000000个,放不下了。 那么我们程序员

    2024年02月12日
    浏览(40)
  • Go语言入门6(struct 结构体)

    ​结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员 type + 结构体名 + struct + {成员列表} ​⭐如果结构体成员名字是以大写字母开头的,那么该成员就是导出的。这是Go语言导出规则决 定的。一个结构体可能同时包含导出和

    2023年04月12日
    浏览(40)
  • 【go语言基础】结构体struct

    主要是敲代码,敲的过程中会慢慢体会。 结构体是用户定义的类型,表示若干字段的集合,目的是将数据整合在一起。 简单的说,类似Java中的实体类。存储某个实体属性的集合。 注意:结构体名字,结构体属性名的首字母大写代表其余的包可以访问该结构体,类似Java中的

    2024年02月13日
    浏览(60)
  • C语言中的typedef struct用法

    在学习数据结构的时候,我经常遇到typedef struct,刚开始感觉很别扭,查阅资料之后才真真理解了。 先从结构体说起。 1、结构体用法 如果要定义一个该结构体变量,就需要:struct Student st1; 有没有觉得很麻烦,我们隐隐约约察觉到,多写一个struct很费劲,因此才有了下面的

    2024年02月07日
    浏览(44)
  • 我记不住的那些C语言的struct知识

    背景 : 最近在重学C语言,目的是为了能看懂操作系统的底层代码,也为后续使用C语言开发一个类似redis数据库的中间件做准备,于是又重新踏上了学习C语言的道路,早在上学期间就学习过C语言,但是很久都不用了,语法和技巧都忘记了。计算机的知识真是浩如烟海,用进

    2024年02月07日
    浏览(38)
  • C语言学习之共用体(union)的运用

    C语言中的共用体: 伪代码表示: 共用体的特点: 1.所有的成员是共享同一块内存空间的 2.所有成员的首地址是一样的; 3.大小取决于共用体中最大的成员; 补充知识: 共用体清0 :使用memset函数,头文件是 string.h ; memset函数格式: 测试代码: 运行结果: 实例要求: 使用

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包