C语言中结构体在实战中的高级用法

2024-01-25 08:36

本文主要是介绍C语言中结构体在实战中的高级用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.结构体嵌套:

2.结构体位域:

3.结构体与指针:

4.结构体对齐和填充:

结构体对齐(Alignment):

例子:

结构体填充(Padding):

例子:

5.灵活数组成员:

6.结构体比较:

7.匿名结构体和共用体:


1.结构体嵌套:

结构体可以嵌套在其他结构体中,形成复合结构。这对于表示更复杂的数据结构很有用。

struct Date {int day;int month;int year;
};struct Person {char name[50];int age;struct Date birthdate;
};// 使用结构体嵌套
struct Person person1;
person1.birthdate.day = 1;
person1.birthdate.month = 1;
person1.birthdate.year = 1990;

2.结构体位域:

结构体位域允许你在一个结构体中指定每个成员占用的位数。这对于节省内存空间和处理硬件寄存器等场景很有用。

struct StatusRegister {unsigned int errorFlag : 1;unsigned int overflowFlag : 1;unsigned int reserved : 30;
};

3.结构体与指针:

结构体和指针可以相互配合使用,允许对结构体进行动态分配和动态访问

struct Point {int x;int y;
};struct Point *ptrToPoint = (struct Point *)malloc(sizeof(struct Point));// 使用指针访问结构体成员
ptrToPoint->x = 10;
ptrToPoint->y = 20;

4.结构体对齐和填充:

结构体成员在内存中的存储通常受到对齐和填充的影响。你可以使用特定的编译指令(例如#pragma pack)来控制对齐和填充。

#pragma pack(push, 1) // 设置字节对齐为1
struct PackedStruct {char c;int i;
};
#pragma pack(pop) // 恢复默认对齐设置

补充知识:

结构体对齐(Alignment):

对齐是指结构体成员在内存中的存储位置相对于结构体的起始地址的偏移。例如,如果一个int类型的成员要求在4字节对齐,那么它将会从结构体的起始地址处偏移至下一个4的倍数的地址。

例子:
struct Example {char c;    // 1字节int i;     // 4字节,按照4字节对齐double d;  // 8字节,按照8字节对齐
};

在这个例子中,如果没有对齐要求,结构体的大小将是1 + 4 + 8 = 13字节。但是,由于对齐的存在,char c后面会有3字节的填充,使得int i从4字节对齐,double d从8字节对齐。因此,结构体的实际大小是16字节。

结构体填充(Padding):

填充是为了满足对齐要求而在结构体成员之间插入的额外字节。填充确保每个成员都位于其所需的对齐边界上。填充的大小取决于结构体成员的数据类型和对齐要求。

例子:
struct Example {char c1;    // 1字节// 3字节填充int i;      // 4字节char c2;    // 1字节// 3字节填充double d;   // 8字节
};

在这个例子中,c1i之间有3字节的填充,保证int i从4字节对齐。类似地,c2d之间也有3字节的填充,保证double d从8字节对齐。

5.灵活数组成员:

结构体可以包含灵活数组成员,这允许动态分配数组大小。

struct DynamicArray {int length;int array[]; // 灵活数组成员
};struct DynamicArray *arr = malloc(sizeof(struct DynamicArray) + 5 * sizeof(int));
arr->length = 5;

6.结构体比较:

结构体之间可以进行比较,但需要逐个比较结构体的成员。为了方便比较,可以使用memcmp函数。

struct Point {int x;int y;
};struct Point p1 = {1, 2};
struct Point p2 = {1, 2};if (memcmp(&p1, &p2, sizeof(struct Point)) == 0) {printf("Points are equal\n");
}

7.匿名结构体和共用体:

C11标准引入了匿名结构体和共用体,允许在不使用结构体或共用体名称的情况下定义它们。

union {struct {int x;int y;};struct {float latitude;float longitude;};
} position;position.x = 10;
position.y = 20;
// 或者
position.latitude = 37.7749;
position.longitude = -122.4194;

这篇关于C语言中结构体在实战中的高级用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642690

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者