当前位置: 首页 > 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.dtcms.com/a/287835.html

相关文章:

  • Windows原生环境配置Claude Code MCP(通过JSON)
  • 简单易懂,快表 详解
  • 有趣的算法题:有时针分针秒针的钟表上,一天之内,时针和分针可重合多少次?分别在什么时刻重合?
  • 【Python】Pandas
  • rustdesk客户端编译
  • QT窗口(7)-QColorDiag
  • 根据ARM手册,分析ARM架构中,原子操作的软硬件实现的底层原理
  • tailscale在ubuntu22.04上使用
  • Unity物理响应函数与触发器
  • LVS详解
  • GitHub 趋势日报 (2025年07月18日)
  • 【图像处理基石】什么是小波变换?
  • CAN总线负载率计算及示例说明
  • 【CVPR2025】计算机视觉|RORem:让物体移除“脱胎换骨”!
  • Streamlit 官翻 2 - 开发指南 Develop Concepts
  • 昇思+香橙派 AI 开发实践:DeepSeek 全流程指南(基于 openEuler)
  • lesson18:Python函数的闭包与装饰器(难)
  • TypeScript 泛型详解:从基础到实战应用
  • 3.条件判断:让程序学会做选择
  • Web开发 03
  • import.meta.glob 与 import.meta.env、import的几个概念的简单回顾
  • react+antd+表格拖拽排序以及上移、下移、移到顶部、移到底部
  • 408数据结构强化(自用)
  • 实现el-select下拉框,下拉时加载数据
  • MYSQL 第一次作业
  • 《命令行参数与环境变量:从使用到原理的全方位解析》
  • Flink实时流量统计:基于窗口函数与Redis Sink的每小时PV监控系统(学习记录)
  • UniApp 自定义导航栏:解决安全区域适配问题的完整实践
  • C++基于muduo库从零实现Rpc框架
  • Ubuntu18.04环境下,vscode使用clangd、bear实时准确跳转过程中遇到的compile_commands.json无法解析问题