结构体与联合体

简介: 结构体与联合体

结构体与联合体

 

结构体(Struct)

结构体是C语言中一种复合数据类型,允许将不同类型的数据项组合成一个单一的类型。结构体中的每个数据项(也称为成员)可以是不同的数据类型,如整型、浮点型、字符型、数组、指针、甚至是其他的结构体。结构体通常用于表示现实世界中的实体或复杂的数据类型。

定义

结构体通过struct关键字来定义,其基本形式如下:

struct tag {

member-list;

} variable-list;

struct tag {

member-list;

};

 

struct tag variable-name;

初始化

结构体可以在声明时初始化,或者使用函数(如memset)在之后初始化。C99标准引入了设计化初始化(Designated Initializers),使得初始化更加直观:

struct Person {

char name[50];

int age;

float height;

};

 

struct Person p1 = {"John Doe", 30, 5.9}; // C99之前的初始化方式

 

// C99及之后的设计化初始化

struct Person p2 = {.name = "Jane Doe", .age = 25, .height = 5.7};

使用场景

表示复杂的数据类型,如学生信息、员工记录等。

作为函数参数或返回值,以传递多个值。

在链表、树等数据结构中作为节点类型。

联合体(Union)

联合体也是一种复合数据类型,但与结构体不同,联合体中的所有成员共享同一块内存空间。联合体的每个成员都从一个相同的内存地址开始,这意味着联合体的最大成员决定了联合体的总大小。

定义

联合体通过union关键字来定义,其基本形式如下:

union tag {

member-list;

} variable-list;

或者,只定义类型,稍后创建变量:

union tag {

member-list;

};

 

union tag variable-name;

初始化

联合体的初始化与结构体类似,但需要注意由于所有成员共享内存,所以初始化时只会设置其中一个成员的值:

union Data {

int i;

float f;

char str[20];

};

 

union Data d = {10}; // i 被初始化为10,f 和 str 的内容未定义

// 或者

union Data d = {.i = 10}; // 使用设计化初始化

使用场景

当你需要在同一块内存中以不同的格式存储数据时。

节省内存空间,特别是在需要存储多个类型相似但大小不同的数据时。

实现类型安全的类型转换(尽管这不是其主要用途,且存在更好的方法)。

总结

结构体和联合体都是C语言中强大的复合数据类型,但它们的用途和行为截然不同。结构体用于将不同类型的数据组合成一个整体,而联合体则用于在相同的内存位置存储不同类型的数据。选择使用哪一种取决于你的具体需求。

 

结构体与联合体在C语言中的深入解析与应用

在C语言中,结构体(Struct)和联合体(Union)是两种重要的复合数据类型,它们允许开发者以更灵活的方式组织和管理数据。这两种类型各有其独特的应用场景和优势,下面将详细解析它们的定义、初始化方法以及在实际编程中的应用。

一、结构体(Struct)

1. 定义与基本形式

结构体是C语言中一种用户自定义的复合数据类型,它允许将不同类型的数据项(成员)组合成一个单一的类型。结构体通常用于表示现实世界中的实体或复杂的数据类型,如学生信息、员工记录等。

定义结构体的基本形式如下:

struct tag {

member-type1 member1;

member-type2 member2;

...

member-typeN memberN;

} variable-list; // 可选,直接定义变量

 

// 或者

struct tag {

member-type1 member1;

member-type2 member2;

...

member-typeN memberN;

};

struct tag variable-name; // 分开定义变量

示例:定义一个表示人的结构体Person。

struct Person {

char name[50];

int age;

float height;

};

2. 初始化

结构体可以在声明时初始化,也可以之后使用函数(如memset)进行初始化。C99标准引入了设计化初始化(Designated Initializers),使得初始化更加直观和灵活。

示例:

使用设计化初始化:

struct Person p1 = {

.name = "John Doe",

.age = 30,

.height = 5.9f

};

 

// 或者(在C99之前)

struct Person p2 = {"John Doe", 30, 5.9f};

注意:设计化初始化中,成员初始化器是可选的,并且顺序不必与结构体定义中的顺序一致。同时,浮点数后面需要明确指定类型(如5.9f表示float类型)。

3. 使用场景

表示复杂的数据类型,如学生信息、员工记录等。

作为函数参数或返回值,以传递多个值。这种方式比单独传递多个参数更为高效和安全。

在链表、树等数据结构中作为节点类型。通过结构体,可以很方便地实现这些数据结构的节点,包含数据部分和指向其他节点的指针。

二、联合体(Union)

1. 定义与基本形式

联合体也是一种复合数据类型,但与结构体不同,联合体中的所有成员共享同一块内存空间。联合体的每个成员都从一个相同的内存地址开始,这意味着联合体的总大小等于其最大成员的大小。

定义联合体的基本形式如下:

union tag {

member-type1 member1;

member-type2 member2;

...

member-typeN memberN;

} variable-list; // 可选,直接定义变量

 

// 或者

union tag {

member-type1 member1;

member-type2 member2;

...

member-typeN memberN;

};

union tag variable-name; // 分开定义变量

示例:定义一个可以存储不同类型数据的联合体Data。

union Data {

int i;

float f;

char str[20];

};

2. 使用与限制

由于联合体成员共享内存,因此同一时间只能存储一个成员的值。

访问联合体时,需要知道当前存储的是哪个成员的值,以避免读取错误的数据。

联合体的主要用途是节省内存,当需要存储的数据类型不同但大小相近时,可以使用联合体来减少内存占用。

3. 应用场景

需要在同一内存位置存储不同类型的数据时,如网络通信中的数据封装。

节省内存空间,尤其是在嵌入式系统或内存受限的环境中。

三、结构体与联合体的结合应用

结构体和联合体可以结合使用,以创建更复杂的数据结构。例如,可以使用结构体来定义数据的主体部分,其中包含联合体成员以处理不同类型的数据。

示例:定义一个包含多种类型数据的Message结构体。

struct Message {

char type; // 标识数据类型

union {

int intData;

float floatData;

char strData[20];

} data;

};

 

相关文章
|
测试技术 uml 容器
UML之包图(Package Diagram)
UML之包图(Package Diagram)
1154 1
|
4月前
|
供应链 监控 安全
你的代码没有任何问题,但你已经被朝鲜黑客完全控制了
2026年3月31日凌晨,全球数百万开发者在毫不知情的情况下,经历了一次教科书级别的供应链攻击。
351 4
|
弹性计算 安全 数据库
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
作为云计算服务核心组件,虚拟化内存管理直接影响业务系统性能表现。本文详解了内存优化方案与技术实践,助您降低30%资源浪费。
507 0
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
|
9月前
|
机器学习/深度学习 搜索推荐 JavaScript
基于python深度学习的经典名著推荐系统
本系统基于Python深度学习技术,结合Django与Vue.js框架,构建智能化经典名著推荐平台。通过分析用户行为与文本特征,实现个性化精准推荐,提升阅读体验,助力经典文化传承与数字阅读升级。
pywinauto教程
pywinauto教程
878 7
|
JSON 算法 安全
1688图片搜索逆向工程与多模态搜索融合实践——基于CLIP模型的特征向
本文介绍了通过逆向工程分析实现图片搜索的技术方案,包括请求特征捕获、签名算法破解及多模态搜索的实现。利用CLIP模型提取图像特征,并结合Faiss优化相似度计算,提升搜索效率。最后提供完整调用示例,模拟实现非官方API的图片搜索功能。
|
API 持续交付 网络架构
深入解析微服务架构:原理、优势与实践
深入解析微服务架构:原理、优势与实践
434 0
|
监控 网络协议 Linux
在Linux中,如何进行网络调优?
在Linux中,如何进行网络调优?
|
机器学习/深度学习 人工智能 编解码
AI文生图模型
8月更文挑战第16天
|
机器学习/深度学习 人工智能 算法
一文尽览!弱监督语义/实例/全景分割全面调研(2022最新综述)(下)
今天分享一篇上交投稿TPAMI的文章,论文很全面的调研了广义上的弱监督分割算法,又涵盖了语义、实例和全景三个主流的分割任务。特别是基于目标框的弱监督分割算法,未来有很大的研究价值和落地价值,相关算法如BoxInst、DiscoBox和ECCV2022的BoxLevelset已经证明了,只用目标框可以实现可靠的分割性能。论文很赞,内容很扎实,分割方向的同学一定不要错过!
一文尽览!弱监督语义/实例/全景分割全面调研(2022最新综述)(下)