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

相关文章

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1