当前位置: 首页 > news >正文

C语言中结构体struct和联合体union的区别

C语言

文章目录

  • C语言
  • 前言
  • 一、什么是结构体
  • 二、什么是联合体
  • 三、结构体和联合体的区别


前言

在这里插入图片描述

一、什么是结构体

在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。也就是说,结构体是由多种元素所构成的数据结构。

struct 结构体
{    任意类型 任意变量; 任意类型 任意变量;    ……}

注意:这不是定义变量,而是自定义一种类型而已。如:

struct student
{
char name[10];//学生姓名
int height;//学生身高
bool sex;//学生性别 假设0表示女,1表示男。
}

类型定义好以后,则可以定义该类型的变量

struct student a,b;// struct可以省略。
可以在定义结构体变量的时候赋值。如
student a={”q”,172,1,b={“x”,172,1};

也可以在定义结构体变量以后赋值,但注意不能再用{}。如:

student a,b;a={”q”,172,1,b={“x”,172,1};//这是错误的。

应该是

a.name="q";
a.height=172;
a.sex=1;

可以在定义结构体类型的时候同时定义结构体变量并赋值。

struct student
{  
char name[10];//学生姓名  
int height;//学生身高  
bool sex;//学生性别 假设0表示女,1表示男。
} a="q",172,1,b={"x",172,1};

访问结构体成员要用直接成员运算符“.”或间接成员运算符“->”。

对于结构体变量,访问其中的成员采取“结构体变量.成员”的形式;而对于结构体指针,访问它所指向的结构体变量中的成员,则采取“结构体指针->成员”形式。

#include <stdio.h>// 定义一个结构体类型
typedef struct {int age;float height;
} Person;int main() {// 定义一个结构体变量Person person1;// 定义一个结构体指针Person *person2;// 为结构体变量赋值person1.age = 25;person1.height = 175.5;// 为结构体指针分配内存并赋值person2 = (Person *)malloc(sizeof(Person));if (person2 == NULL) {printf("Memory allocation failed\n");return 1;}person2->age = 30;person2->height = 180.0;// 通过结构体变量访问成员printf("Person1 Age: %d\n", person1.age);printf("Person1 Height: %.2f\n", person1.height);// 通过结构体指针访问成员printf("Person2 Age: %d\n", person2->age);printf("Person2 Height: %.2f\n", person2->height);// 释放分配的内存free(person2);return 0;
}

二、什么是联合体

联合体也是一种自定义的复合类型,它可以包含多个不同类型的变量。这些变量在内存当中共用一段空间。这段空间的size就是各变量中size最大的那个变量。

union myunion
{int num1;  double num2;  float num3;};

定义了一个联合体类型myunion。
myunion a,b;//定义了两个myunion型变量。也可以在定义联合体类型的时候定义联合体变量。如:

union myunion
{  
int num1; 
double num2; 
float num3;}a,b;

a占用的空间有多大呢?Sizeof(a)结果为8,即myunion占用8个字节,和double型变量相同。
注意:任一时刻,只能访问结构体里面的一个变量。

联合体(Union)与结构体相似,但它们的区别在于联合体中只能同时存储一个成员的值。这些成员共享同一个物理存储空间,也就是说,一个联合体的大小,等于它最大的成员变量所占据的空间。

#include <stdio.h>// 定义一个联合体类型
typedef union {int i;float f;char c;
} Data;int main() {// 创建一个联合体变量Data data;// 向联合体的 int 成员赋值data.i = 10;printf("Data.i = %d\n", data.i);// 向联合体的 float 成员赋值data.f = 3.14;// 注意,这会覆盖之前存储在 i 中的值printf("Data.f = %.2f\n", data.f);// 向联合体的 char 成员赋值data.c = 'A';// 注意,这会覆盖之前存储在 f 中的值printf("Data.c = %c\n", data.c);// 打印联合体的大小printf("Size of union Data = %zu bytes\n", sizeof(data));return 0;
}

在这里插入图片描述

三、结构体和联合体的区别

1.结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址。在计算一个结构型变量的总长度时,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度。
2.对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了,而对结构体的不同成员赋值是互不影响的。

相关文章:

C语言中结构体struct和联合体union的区别

C语言 文章目录 C语言前言一、什么是结构体二、什么是联合体三、结构体和联合体的区别 前言 一、什么是结构体 在C语言中&#xff0c;结构体指的是一种数据结构&#xff0c;是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等&#xff0c;用以实现较复杂的数…...

Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写

Verilog&#xff1a;【8】基于FPGA实现SD NAND FLASH的SPI协议读写 在此介绍的是使用FPGA实现SD NAND FLASH的读写操作&#xff0c;以雷龙发展提供的CS创世SD NAND FLASH样品为例&#xff0c;分别讲解电路连接、读写时序与仿真和实验结果。 目录 1 FLASH背景介绍 2 样品申请 3…...

目标检测-RT-DETR

RT-DETR (Real-Time Detection Transformer) 是一种结合了 Transformer 和实时目标检测的创新模型架构。它旨在解决现有目标检测模型在速度和精度之间的权衡问题&#xff0c;通过引入高效的 Transformer 模块和优化的检测头&#xff0c;提升了模型的实时性和准确性。RT-DETR 可…...

业务资源管理模式语言09

示例&#xff1a; 图13 表示了QuoteTheMaintenance 模式的一个实例&#xff0c;在汽车修理店系统中&#xff0c;其中“Vehicle”扮演“Resource”&#xff0c;“Repair Quotation”扮演“Maintenance Quotation”&#xff0c;“Repair shop branch”扮演“Source-party”&…...

Spring Boot + Vue 多级目录的构建详解

1. 背景介绍 1.1 为何选择 Spring Boot Vue&#xff1f; 在现代 Web 开发中&#xff0c;前后端分离已成为一种标准实践。Spring Boot 提供了强大的后端开发能力&#xff0c;尤其在构建企业级应用时&#xff0c;其轻量级、高效性和丰富的生态系统让开发者如虎添翼。而 Vue.js…...

Android的Launch

看了一下资料&#xff0c;其实差别并不像一般的bootloader之类那么大。基本上还是和普通的APK程序差不多&#xff0c;基本上是AMS启动的第一个带界面的程序&#xff0c;这个界面也是常规的开发模式。可以设置各种view&#xff0c;可以设置背景。 然后在这个程序中&#xff0c;…...

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并导出数据集. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename : Test.hdict” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev 但发现很慢&#xff0c;没有mlp…...

图片验证码

导入依赖 <dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency> </dependencies> 代码 Service public class ValidateCodeServi…...

004: VTK读入数据---vtkImageData详细说明

VTK医学图像处理---vtkImageData类 目录 VTK医学图像处理---vtkImageData类 简介&#xff1a; 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据 2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介&#xff1a;…...

分割千万级,将大文件分割为小件 csv

依赖 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.9.0</version></dependency> package com.topnet.controller;import com.topnet.utils.R; import lombok.extern.slf4j.Slf4…...

SQL COUNT() 函数深入解析

SQL COUNT() 函数深入解析 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;的标准编程语言。在SQL中&#xff0c;COUNT() 函数是一个常用的聚合函数&#xff0c;用于计算数据表中的行数或特定列的值数量…...

vue3和vue2的双向绑定原理

Vue 的双向绑定是其核心特性之一&#xff0c;允许数据和视图之间保持同步。在 Vue 2 和 Vue 3 中&#xff0c;双向绑定的实现原理有所不同。以下是两者的原理对比&#xff1a; Vue 2 的双向绑定原理 在 Vue 2 中&#xff0c;双向绑定是通过以下机制实现的&#xff1a; 响应式…...

[C++]刷题

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月20日 最后&#xff1a; 十分感谢你可以耐着性子把它读完和我可以坚持写到这里&#xff0c;送几句话&#xff0c;对你&#xff0c;也对我&#xff1a; 1.一个冷知识&#xff1a; …...

职称评审中,论文发表要求?

无论是医生、教师或其他等职业&#xff0c;职称评审无疑是一个非常重要的环节。而职称评审中的论文发表则是评定我们专业能力的重要一环&#xff0c;可如何才能让自己辛苦撰写的的论文被发表&#xff0c;达到论文发表都有哪些要求呢&#xff1f; 一、选题要新颖 编辑和审稿人…...

连续信号的matlab表示

复习信号与系统以及matlab 在matlab中连续信号使用较小的采样间隔来表四 1.单位阶跃信号 阶跃信号:一个理想的单位阶跃信号在时间 t 0 之前值为0&#xff0c;在 t 0 及之后值突然变为常数 A&#xff08;通常取 A 1&#xff09; %matlab表示连续信号,是让信号的采样间隔很小…...

centos7.9搭建mysql5.6主从

mysql5.6 搭建数据库配置主从 搭建数据库 官网下载软件包后上传 基于centos7.9搭建mysql5.6.42 [rootmysql02 ~]# ls anaconda-ks.cfg init.sh MySQL-5.6.42-1.el7.x86_64.rpm-bundle.tar解压 tar -xf MySQL-5.6.42-1.el7.x86_64.rpm-bundle.tar -C /opt/[rootmysql02 ~]…...

C#通过ACE OLEDB驱动程序访问 Access和 Excel

ACE 代表 Access Connectivity Engine。它是 Microsoft 提供的一组组件&#xff0c;用于访问和操作 Microsoft Access 数据库以及其他类似的文件格式&#xff0c;如 Excel 工作簿。ACE 主要包括以下几部分&#xff1a; ACE OLEDB 驱动程序&#xff1a;用于通过 OLE DB 提供程序…...

智能新纪元:GPT-Next引领的AI革命及其跨领域应用

GPT-Next&#xff1a;性能的百倍提升 在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具活力和变革性的领域之一。最近&#xff0c;OpenAI在KDDI峰会上宣布了一项激动人心的消息&#xff1a;他们即将推出名为“GPT-Next”的新一代语言模…...

Nexus配置npm私服

1&#xff0c;配置npm-hub 2&#xff0c;配置proxy-npm 3&#xff0c;配置group-npm 4&#xff0c;配置local-npm 5&#xff0c;配置淘宝...

《OpenCV计算机视觉》—— 图像轮廓检测与绘制

文章目录 一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现 三、轮廓的近似 一、轮廓的检测 轮廓检测是指在包含目标和背景的数字图像中&#xff0c;忽略背景和目标内部的纹理以及噪声干扰的影响&#xff0c;采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮…...

AMLP框架实战:基于MACE构建高精度机器学习势函数

1. 项目概述&#xff1a;当机器学习势函数遇上自动化管道在计算化学和材料科学领域&#xff0c;我们长久以来面临着一个核心矛盾&#xff1a;精度与效率的权衡。密度泛函理论&#xff08;DFT&#xff09;能提供接近实验的精度&#xff0c;但计算成本高昂&#xff0c;通常只能处…...

PA100K数据集实战:从下载到结构化解析全流程

1. PA100K数据集初探&#xff1a;为什么选择它&#xff1f;如果你正在研究行人属性识别&#xff0c;PA100K绝对是个绕不开的宝藏数据集。这个数据集包含了10万张真实监控场景下的行人图像&#xff0c;每张图都标注了26种常见属性——从衣着风格&#xff08;比如是否穿T恤、裙子…...

别再死记硬背SMO公式了!用Python手写一个SVM分类器,带你一步步拆解SMO核心逻辑

用Python手写SVM分类器&#xff1a;代码驱动理解SMO算法核心在机器学习领域&#xff0c;支持向量机(SVM)以其优秀的分类性能和坚实的数学基础著称。然而&#xff0c;许多学习者在理解其核心算法——序列最小优化(SMO)时&#xff0c;往往被复杂的数学推导所困扰。本文将采用一种…...

小米MIMO最新邀请码

欢迎使用&#xff0c;各得10元体验金...

如何进行TVA仿真引擎的“光照地狱”训练?

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

【深度解析】AI Coding 模型竞速:从 Claude Mythos 安全编码到 GPT-5.6 传闻,如何落地代码审查智能体

摘要 AI 编码模型正在从“代码补全”进入“复杂代码库理解、漏洞发现与自动修复”阶段。本文结合 Claude Mythos、Claude Opus 4.8 与 GPT-5.6 相关信息&#xff0c;解析新一代 Coding Agent 的技术趋势&#xff0c;并给出基于大模型 API 的代码安全审查实战方案。背景介绍&…...

WebSocket实时通信架构进阶:Room、命名空间与集群部署

WebSocket实时通信架构进阶:Room、命名空间与集群部署 作者:Crown_22 | AI Agent & Hermes Agent 桌面程序开发者 前言 WebSocket已经成为实时应用的标准技术,但大多数教程只停留在"建立连接、发送消息"的基础阶段。在生产环境中,你需要处理Room管理、命名空…...

别再手动编译了!Matlab一键调用CEC2017测试函数的完整配置指南(附30个函数调用示例)

别再手动编译了&#xff01;Matlab一键调用CEC2017测试函数的完整配置指南&#xff08;附30个函数调用示例&#xff09; 算法研究者们常常需要借助标准测试函数来验证优化算法的性能&#xff0c;而CEC2017测试函数集因其复杂性和多维度的挑战性&#xff0c;成为评估算法鲁棒性的…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose&#xff1f;5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

通用物联网开发板设计:基于ESP8266的硬件集成与开发实践

1. 项目概述&#xff1a;为什么我们需要一块“通用”的物联网开发板&#xff1f;在捣鼓了几年物联网项目之后&#xff0c;我发现自己桌面上堆满了各种开发板&#xff1a;ESP8266、ESP32、Arduino Uno、STM32 Nucleo……每个项目都要重新连线、配置电源、焊接传感器接口&#xf…...