首页 > 其他分享 >结构体与共用体的区别

结构体与共用体的区别

时间:2023-11-28 18:33:29浏览次数:34  
标签:存储 区别 成员 数据类型 value 内存 共用 结构

C语言中的结构体(struct)和共用体(union)是用来存储不同类型的数据的复合数据类型,但它们在内存中的存储方式是有很大区别的

一、结构体

  • 定义:结构体是一种用户自定义的数据类型,允许在一个单独的实体中存储不同类型的数据。结构体的成员可以是不同的数据类型。
  • 内存分配:结构体的各个成员在内存中是按照其声明的顺序依次存储的,每个成员都有自己的内存空间。
  • 大小计算:结构体的大小等于所有成员大小的总和,但可能会因为内存对齐的原因而有所增加。
  • 访问成员:可以通过结构体变量的成员运算符.来访问结构体的成员。
#include <iostream>

struct Person {
    char name[50];
    int age;
    float salary;
};

int main() {
    std::cout << sizeof(struct Person) << std::endl;

    struct Person person;
    person.age = 18;
    person.salary = 12400.0;

    std::cout << person.age << std::endl;
    std::cout << person.salary << std::endl;

    return 0;
}

输出结果: 

二、共用体

  • 定义:共用体也是一种用户自定义的数据类型,但它允许在同一内存空间存储不同类型的数据,但一次只能存储其中一个成员。
  • 内存分配:共用体的所有成员共享同一块内存空间,因此共用体的大小等于最大成员的大小。
  • 大小计算:共用体的大小等于最大成员的大小。
  • 访问成员:通过共用体变量的成员运算符.来访问共用体的成员,只能访问当前存储的成员
#include <iostream>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data value;
    value.i = 10;
    value.f = 40.0;
    
    std::cout << sizeof(union Data) << std::endl;
    std::cout << value.i << std::endl;
    std::cout << value.f << std::endl;

    return 0;
}

打印结果: 

由打印结果可以看出,共用体共用一块内存,当初始化value.f = 40.0时,它会把value.i = 10覆盖掉然后给它赋一个随机值。

标签:存储,区别,成员,数据类型,value,内存,共用,结构
From: https://www.cnblogs.com/TechNomad/p/17862660.html

相关文章

  • VUE与WPF树形控件的区别与使用
    VUE:树形结构显示,主要在数据查询的时候把数据拼成树形结构的数据,注意:VUE中树形结构体必须要有children,此对象必须是list类型WPF:树形结构显示,是把所有的数据查询到,然后WPF中的控件通过ID和PID来自动把数据呈现成树形结构 ......
  • 小心C#中的只读结构体成员
    示例我们先来看一段结构体的代码(基于VS2022+.NET8.0)publicstructMyStruct(intnumber){publicintNumber=number;publicvoidSetNumber(intnumber)=>Number=number;}publicclassProgram{privatestaticMyStructmyStruct=new(1);......
  • API 接口主流协议有哪些?及WebService和Restful之间的区别和联系?
    API接口主流协议有哪些?如何创建HTTP/HTTPS、WebSocket/WebSockets、TCP/UDP、gRPC、SOAP、Dubbo/HSF等不同协议?RESTFUL:简单来说就是对HTTP请求的方式和路径的一种约束规则,一种思想。只要是符合这种思想的HTTP接口都可以叫做RESTFUL接口即同一个路径,相同的参数,请求方式的不同......
  • v-show和v-if的用法和区别
    一、用法v-if是Vue.js中常用的条件渲染指令,根据表达式的值来动态控制元素的显示或隐藏。具体的使用方法如下:1.基本语法<divv-if="condition"><!--content--></div><divv-if="condition"><!--content--></div>其中,v-if后面跟着一个表达式condition,如果该表达式......
  • C# action,delegate,func的用法和区别
      举个委托的例子:  小明去书店买一本书。  1、买书:privatedelegatevoidBuyBook();  2、附近书店(委托的方法):publicstaticvoidBook(){MessageBox.Show("提供书籍");}  3、小明和书店建立关系(给委托绑定方法)BuyBookbuybook=newBuyBook(Book);......
  • Golang - context.TODO()和context.Background()的区别
    context.Background():上下文的默认值(创建上下文的默认起点),这个函数返回一个空context,返回值就是根节点,这只能用于最高等级(在main函数、初始化或顶级请求处理中),因为所有其他的上下文都应该从它衍生(Derived)出来context.TODO():通常用作占位符或临时解决方案,只在不确定应该使用哪种上......
  • cookie和session的区别?一文讲透
    一、问题cookie和session的区别? 二、回答1、总结如下-cookie: -cookie存储于客户端本地,即浏览器缓存 -cookie存储着sessionId,作为后台session缓存的主键,可以快速识别用户身份,减少后台请求 -问题:数据量较小,不适合存储大数据,如有些图片很大就支撑不了 -问......
  • js event.target和event.currentTarget区别
    首先本质区别是:event.target返回触发事件的元素event.currentTarget返回绑定事件的元素事例<ahref="#"class="text-nowrapdropdown-itemdropdown-footerrole-link"role="aaa"><te(ddd)>test</te(ddd)></a>event.target取得是<te(dd......
  • AddTransient、AddSingleton、AddScoped的区别
    权重:AddSingleton→AddTransient→AddScopedAddSingleton的生命周期:项目启动-项目关闭 相当于静态类 只会有一个 AddScoped的生命周期:请求开始-请求结束 在这次请求中获取的对象都是同一个 AddTransient的生命周期:请求获取-(GC回收-主动释放)每一次获取的对象都不......
  • 计算机体系结构与性能总结
    计算机总体体系结构如上图,计算机从硬件到软件,而计算机系统结构就处于连接硬件与软件之间。底层为实际机器,即更偏向硬件,使用机器语言,高层为虚拟机器,即更偏向软件,使用汇编语言可转化为机器语言,这是软硬件相连节点,更高级即为高级语言。提升计算机系统性能时,总共有以下几种方法依据......