【C语言】结构体

本文详细介绍了C语言中的结构体概念,包括声明、成员变量类型、初始化、自引用的正确实现、结构体大小的计算(对齐规则)、以及如何修改对齐数。同时讨论了结构体传参的两种方式及其效率考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

👑个人主页:啊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这个预处理指令,达到改变编译器默认对齐数的目的

代码如下:

四.结构体传参 

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

代码如下:

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

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

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

 

内容概要:本文档详细介绍了一个基于MATLAB实现的电力负荷预测项目,该项目运用遗传算法(GA)优化支持向量回归(SVR)和支持向量机(SVM)模型的超参数及特征选择。项目旨在解决电力系统调度、发电计划、需求侧响应等多个应用场景中的关键问题,特别是在应对高比例可再生能源接入带来的非线性、非平稳负荷预测挑战。文中涵盖了从数据接入、特征工程、模型训练到部署上线的全流程,包括详细的代码示例和GUI设计,确保方案的可复现性和实用性。 适用人群:具备一定编程基础,尤其是熟悉MATLAB语言和机器学习算法的研发人员;从事电力系统调度、电力市场交易、新能源消纳等相关领域的工程师和技术专家。 使用场景及目标:①通过构建面向小时级别的滚动预测,输出高分辨率负荷轨迹,为日内与日前滚动调度提供边际成本最小化的依据;②在负荷高峰和供给紧张时,通过价格信号或直接负荷控制实施需求侧响应,提升削峰效率并抑制反弹;③为灵活性资源(调峰机组、储能、可中断负荷)提供更清晰的出清路径,降低弃风弃光率,提升系统整体清洁度;④帮助市场主体更准确地评估边际出清价格变化,提高报价成功率与收益稳定性,同时降低由预测偏差带来的风险敞口;⑤在运维与审计场景中,对预测产生的原因进行说明,保障业务侧与监管侧的可追溯性。 阅读建议:此资源不仅提供了完整的代码实现和GUI设计,更注重于理解GA优化过程中涉及到的数据处理、特征构造、模型选择及评估等核心步骤。因此,在学习过程中,建议结合实际案例进行实践,并深入研究每个阶段的具体实现细节,特别是适应度函数的设计、超参数空间的定义以及多样性维护机制的应用。此外,关注项目中关于数据对齐、缺失值处理、特征标准化等方面的最佳实践,有助于提高模型的鲁棒性和泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值