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语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数…...
Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写
Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写 在此介绍的是使用FPGA实现SD NAND FLASH的读写操作,以雷龙发展提供的CS创世SD NAND FLASH样品为例,分别讲解电路连接、读写时序与仿真和实验结果。 目录 1 FLASH背景介绍 2 样品申请 3…...
目标检测-RT-DETR
RT-DETR (Real-Time Detection Transformer) 是一种结合了 Transformer 和实时目标检测的创新模型架构。它旨在解决现有目标检测模型在速度和精度之间的权衡问题,通过引入高效的 Transformer 模块和优化的检测头,提升了模型的实时性和准确性。RT-DETR 可…...
业务资源管理模式语言09
示例: 图13 表示了QuoteTheMaintenance 模式的一个实例,在汽车修理店系统中,其中“Vehicle”扮演“Resource”,“Repair Quotation”扮演“Maintenance Quotation”,“Repair shop branch”扮演“Source-party”&…...
Spring Boot + Vue 多级目录的构建详解
1. 背景介绍 1.1 为何选择 Spring Boot Vue? 在现代 Web 开发中,前后端分离已成为一种标准实践。Spring Boot 提供了强大的后端开发能力,尤其在构建企业级应用时,其轻量级、高效性和丰富的生态系统让开发者如虎添翼。而 Vue.js…...
Android的Launch
看了一下资料,其实差别并不像一般的bootloader之类那么大。基本上还是和普通的APK程序差不多,基本上是AMS启动的第一个带界面的程序,这个界面也是常规的开发模式。可以设置各种view,可以设置背景。 然后在这个程序中,…...
Deep Ocr
1.圈出内容,文本那里要有内容.然后你保存,并导出数据集. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename : Test.hdict” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev 但发现很慢,没有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类 简介: 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据 2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介:…...
分割千万级,将大文件分割为小件 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(Structured Query Language)是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。在SQL中,COUNT() 函数是一个常用的聚合函数,用于计算数据表中的行数或特定列的值数量…...
vue3和vue2的双向绑定原理
Vue 的双向绑定是其核心特性之一,允许数据和视图之间保持同步。在 Vue 2 和 Vue 3 中,双向绑定的实现原理有所不同。以下是两者的原理对比: Vue 2 的双向绑定原理 在 Vue 2 中,双向绑定是通过以下机制实现的: 响应式…...
[C++]刷题
作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年6月20日 最后: 十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我: 1.一个冷知识: …...
职称评审中,论文发表要求?
无论是医生、教师或其他等职业,职称评审无疑是一个非常重要的环节。而职称评审中的论文发表则是评定我们专业能力的重要一环,可如何才能让自己辛苦撰写的的论文被发表,达到论文发表都有哪些要求呢? 一、选题要新颖 编辑和审稿人…...
连续信号的matlab表示
复习信号与系统以及matlab 在matlab中连续信号使用较小的采样间隔来表四 1.单位阶跃信号 阶跃信号:一个理想的单位阶跃信号在时间 t 0 之前值为0,在 t 0 及之后值突然变为常数 A(通常取 A 1) %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 提供的一组组件,用于访问和操作 Microsoft Access 数据库以及其他类似的文件格式,如 Excel 工作簿。ACE 主要包括以下几部分: ACE OLEDB 驱动程序:用于通过 OLE DB 提供程序…...
智能新纪元:GPT-Next引领的AI革命及其跨领域应用
GPT-Next:性能的百倍提升 在当今这个科技日新月异的时代,人工智能(AI)无疑是最具活力和变革性的领域之一。最近,OpenAI在KDDI峰会上宣布了一项激动人心的消息:他们即将推出名为“GPT-Next”的新一代语言模…...
Nexus配置npm私服
1,配置npm-hub 2,配置proxy-npm 3,配置group-npm 4,配置local-npm 5,配置淘宝...
《OpenCV计算机视觉》—— 图像轮廓检测与绘制
文章目录 一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现 三、轮廓的近似 一、轮廓的检测 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮…...
ComfyUI-Manager下载加速终极指南:3倍性能提升实战解析
ComfyUI-Manager下载加速终极指南:3倍性能提升实战解析 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cust…...
2026最权威的十大降重复率神器实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于当下竞争极为激烈的商业环境之中,企业降本增效的需求变得越发迫切,…...
玩转线控转向:从方向盘到轮胎的数学游戏
线控转向系统模型simulink, 以及理想传动比,变传动比,变角传动比simulink模块,分别在低速工况,中速工况,高速工况下进行对比仿真,结果较好 有对应绘图代码m脚本文件,模型对应的论文最近在Simuli…...
tchMaterial-parser:开源教育工具助力电子教材高效获取
tchMaterial-parser:开源教育工具助力电子教材高效获取 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目地址…...
Unity游戏翻译解决方案:多框架适配与实时翻译优化应用指南
Unity游戏翻译解决方案:多框架适配与实时翻译优化应用指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator Unity游戏翻译技术正成为全球化游戏开发的关键环节,XUnity.AutoTranslat…...
傅里叶级数7大核心性质详解:从时移特性到微分性快速掌握
傅里叶级数7大核心性质详解:从时移特性到微分性快速掌握 信号与系统课程中,傅里叶级数就像一把瑞士军刀,能将复杂的周期信号拆解成简单的正弦波组合。对于备考学生而言,掌握其核心性质不仅能快速解题,更能深入理解信号…...
Alibaba DASD-4B Thinking 对话工具入门:Anaconda虚拟环境配置与模型调用
Alibaba DASD-4B Thinking 对话工具入门:Anaconda虚拟环境配置与模型调用 想试试最新的对话模型,但被复杂的依赖和版本冲突搞得头大?这感觉我太懂了。很多朋友在接触像Alibaba DASD-4B这类大模型时,第一步就卡在了环境配置上&…...
【好靶场】越权获取信息
访问页面是一个个人信息页面我们看下雪瞳,可以看到的2个API接口直接抓包发现是可以进行水平越权直接进行intruder得到flag...
SwiftData中的级联删除关系
在开发iOS应用程序时,数据模型的设计和管理至关重要。SwiftData是Apple在WWDC 2023上推出的新框架,旨在简化数据模型的创建和操作。今天,我们来探讨一下如何在SwiftData中实现级联删除关系。 什么是级联删除? 级联删除是一种数据库关系模型中的操作规则,当一个主记录被删…...
终极指南:LLMLingua JSON数据压缩与字段级定制策略
终极指南:LLMLingua JSON数据压缩与字段级定制策略 【免费下载链接】LLMLingua [EMNLP23, ACL24] To speed up LLMs inference and enhance LLMs perceive of key information, compress the prompt and KV-Cache, which achieves up to 20x compression with minim…...
