【C语言】结构体

👑个人主页:啊Q闻       

🎇收录专栏:《C语言》           

 🎉道阻且长,行则将至

一.初识结构体 

1.结构的声明

结构是一些值的集合,这些值称为成员变量。结构的每个成员都可以是不同的类型,可以为整型,字符型,也可以为指针,数组等。

举个例子:

struct Stu
{
    char name[20];//姓名
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
};//注意该处有个分号

2.结构体变量的创建和初始化

#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
};
int main()
{
	struct Stu s = { "张三",20,"男","202311588" };//按照结构体成员的顺序初始化
	printf("name:%s\n", s.name);
	printf("age:%d\n", s.age);
	printf("sex:%s\n", s.sex);
	printf("id:%s\n", s.id);
	
	printf("\n");
	struct Stu ss = { .age = 18,.name = "lisi",.id = "202311544",.sex = "男" };//按照指定顺序初始化
	printf("name:%s\n", ss.name);
	printf("age:%d\n", ss.age);
	printf("sex:%s\n", ss.sex);
	printf("id:%s\n", ss.id);
	return 0;
}

详解: 

3.结构的特殊声明

 在声明结构的时候,可以不完全声明,我们称这种为匿名的结构体类型,如果没有对结构体类型重命名的话,基本只能使用一次。

即:

二.结构的自引用 

结构如何实现自引用呢?

我们先看一个例子:

struct Node
{
  int data;
  struct Node next;//该处为结构自引用
};

上述代码其实不正确,因为一个结构体中再包含一个同类型的结构体变量,那这样的结构体大小不就是无穷大吗?是不合理的。 

 正确的自引用:

struct Node
{
  int data;
  struct Node*next;//利用指针进行自引用,就可以避免上述情况
};

三.结构体的大小 

了解结构自引用后,我们是不是有些好奇结构体大小是如何计算的呢?

这里我们需要了解结构体的内存对齐规则

1.对齐规则 

规则如下:

 1.结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。

2.其他成员变量要对齐到对齐数的整数倍的地址处。

3.对齐数=编译器默认的一个对齐数与该成员变量大小较小值。(VS默认的值为8Linux中gcc没有默认的对齐数,对齐数就是成员自身的大小)。

4.结构体总大小最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍

5.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。

我们从下面代码中具体体会:

代码一:

 详解1:

代码二:

详解2:

代码三:

 详解3:

对齐规则的意义:结构体的内存对齐是拿空间换取时间的方法,在设计结构体的时候,我们既要满足对齐,又要节省空间,所以:让占用空间小的成员尽量集中在一起 。 

 2.修改对齐数

我们可以利用#pragma这个预处理指令,达到改变编译器默认对齐数的目的

代码如下:

四.结构体传参 

结构体传参通常有两种方式:传值和传址

代码如下:

但两者相比,我们首选传址,因为:

函数传参时,需要压栈,会有时间和空间上的系统开销。如果传递一个结构体对象时,结构体过大,参数压栈的系统开销比较大,会导致性能下降。

 谢谢大家阅读,如果对你有帮助,三连三连支持一下🎈

 

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值