当前位置: 首页 > news >正文

【C语言进阶】结构体

        在[C语言入门]的板块,我们浅显地讨论过结构体的内容,这一期将深刻介绍结构体,后面的一期内容会做联合、枚举相关的内容。

目录

1.结构体类型的声明

2.结构体的自引用

3.结构体变量的定义和初始化

4.结构体内存对齐(重点)

5.结构体传参

6.结构体实现位段(位段的填充&可移植性)


1.结构体类型的声明

        结构体是一些值的集合,这些值称之为成员变量,结构的每个成员变量都可以是不同类型的变量;

关于结构体类型的定义,举一个简单的例子:写一个关于学生的结构体,成员列表含姓名、年龄。

        有读者会问了,结构体中的成员变量不需要初始化吗?我们可以把结构体当做一个普通的类型,例如int、char类型,类型是修饰变量的,所以不需要初始化;  

        上图中的s1,s2是根据这个类型创造出的结构体变量,可以不加,此时这个两个结构体变量是全局变量,当然可以创建局部的结构体变量,如下图所示:

         创建结构体变量的时候需要书写struct XXX 结构体变量名,过于繁琐,我们可以使用以下这种方式:

匿名结构体,不能手动创建结构体变量只能使用一次。

        匿名结构体是有一个缺点的,那就是没有类型,如果两个匿名结构体的内部成员变量,我们依然认为这是两个不同类型的结构体。 

能不能对匿名结构体进行使用typedef呢?是不行的,匿名结构体本身没有类型,所以不能进行简化。

 我们还可以这么写,相当于创建了一个结构体指针。

2.结构体的自引用

        我们知道在数据结构中有顺序表和链表。顺序表例如数组,可以理解成在内存中连续存储的数据;

        链表在内存中是分散存储的,节点和节点之间是靠存储下一个节点的信息进行关联的,存储的节点类型和本类型完全一致,这就叫自引用。

         这么写是有问题的,试想一下:next是你下一个节点的内容,next也存放着关于它下一个结构体的内容,如此以来只要链表一长,在最前面的结构体存的内容是海量的,所以为了解决这个问题,我们只需要存储下一个节点的地址即可,每一个节点只能获取下一个节点的相关信息,我们可以用结构体指针来指向下一个结构体;这就是我们常说的数据域+指针域。

3.结构体变量的定义和初始化

struct Point
{int x;int y;
}p1; // 结构体变量struct Point p2;// 定义结构体变量p2// 初始化,定义变量的同时赋初值
struct Point p3 = {x,y};struct Stu
{char name[15];int age; 
};
struct Stu s = {"zhangsan",20};// 初始化

我们可以把结构体(类型)当做图纸,结构体变量当做具体的房子。

        结构体中含结构体,进行初始化的时候,只需要加一个大括号即可~

我们可以使用结构体变量+.的形式访问结构体变量的成员变量。

4.结构体内存对齐(重点)

待续......

5.结构体传参

6.结构体实现位段(位段的填充&可移植性)

http://www.xdnf.cn/news/1148185.html

相关文章:

  • Linux常用指令大全
  • 力扣经典算法篇-26-长度最小的子数组(暴力求解法,左右指针法)
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的对话系统多轮交互优化与用户体验提升(351)
  • ROS2 通过相机确定物品坐标位置
  • 在非Spring Boot的Spring项目中使用Lock4j
  • 开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例
  • SPARKLE:深度剖析强化学习如何提升语言模型推理能力
  • 智慧资产管理系统需求文档
  • uniapp中腾讯地图SDK-安装及配置(自动定位回显城市)
  • Validation - Spring Boot项目中参数检验的利器
  • 打造高效订单处理!ZKmall开源商城的统一履约中心架构解析
  • UGUI 性能优化系列:第三篇——渲染与像素填充率优化
  • Vue3生命周期函数
  • ABP VNext + Kubernetes Istio:微服务网格实战指南
  • Word快速文本对齐程序开发经验:从需求分析到实现部署
  • 深度学习Depth Anything V2神经网络实现单目深度估计系统源码
  • Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)
  • 市场数据+幸存者偏差提问,有趣的思考?
  • [论文阅读] 人工智能 + 软件工程 | 强化学习在软件工程中的全景扫描:从应用到未来
  • 异世界历险之数据结构世界(二叉树-leetcode)
  • 【2025最新】 .NET FrameWork微软离线运行库合集,一键安装版
  • 【C# in .NET】19. 探秘抽象类:具体实现与抽象契约的桥梁
  • 《Electron应用性能深耕:资源加载与内存治理的进阶路径》
  • 辛普森悖论
  • 用虚拟机体验纯血鸿蒙所有机型!
  • OpenCV 官翻7 - 对象检测
  • 13.5 Meta LLaMA 2核心技术拆解:4T数据训练+30%显存优化,70B模型准确率82.6%
  • 文件搜索的工具
  • Rust Web 全栈开发(十):编写服务器端 Web 应用
  • Flink实时流量统计:基于窗口函数与Redis Sink的每小时PV监控系统(学习记录)