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

【C语言】struct结构体内存对齐和位段(超详解) - 教程

【C语言】struct结构体(超详解)

  • 一、结构体是什么?
    • 1.为什么有结构体
    • 2.结构体简介
    • 3.结构体的声明
    • 4.结构体的定义
    • 5.结构体变量的初始化
    • 6.结构体访问操作符( . )
    • 6.结构体数组
    • 7.结构体指针(最重要)
    • 8.结构体访问操作符( -> )
  • 结语

前言:
本期开始详解结构体,由于文章过长,所以分了几篇文
包括结构体概念,结构体的内存对齐以及位段
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持
谢谢大家 ! ! !

一、结构体是什么?

1.为什么有结构体

结构体是C语言中的自定义数据类型,用于描述现实中的复杂对象。而C语言单一内置类型如char、int、float等无法完整描述现实中的复杂对象。
例如:
在生活中描述一名在校学生,有姓名、性别、学号、班级、成绩等等,其中既有int整型,又有float浮点型,还有char字符型等等
此处的在校学生就是一个复杂对象,单一内置类型如char、int、float等无法完整描述该在校学生

2.结构体简介

结构体就是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量
姓名、性别、学号等就可以集合成一个结构体 。

3.结构体的声明

struct tag//结构体标签名
{
member - list;//成员变量列表
}variable - ist;//变量列表
tag : 结构体标签名(自定义)
struct tag :结构体类型
member - list : 成员变量列表(至少一个成员)
variable - ist : 可选的变量列表(可直接创建变量)

4.结构体的定义

这里我们定义一个结构体包含一名学生的姓名(name)、年龄(age)、成绩(score)
字符数组存储学生姓名
整型存储年龄
浮点型存储成绩

代码演示:
先定义结构体类型,再定义结构体变量

struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S;//定义结构体变量

5.结构体变量的初始化

代码演示:

struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量

初始化后 xiaobai , 18 , 88.8 这些信息就被输入到结构体变量 S 中了
那么该怎么使用这个结构体变量呢?

6.结构体访问操作符( . )

  • 点操作符:. )

通过点操作符我们可以对结构体成员进行访问
将成员一一拿出来

语法:结构体变量名 . 结构体成员名
示例:S . name 访问字符成员name

代码演示:

#include <stdio.h>struct student//结构体变量名{char name[20];//姓名int age;//年龄float score;//成绩}; //定义结构体类型struct student S = { "xiaobai",18,88.8 };//定义并初始化结构体变量int main(){printf("%s\n%d\n%f", S.name, S.age, S.score);//依次打印出结构体成员return 0;}

运行结果:
在这里插入图片描述

6.结构体数组

我们说一个结构体可以表示一名学生的信息,但是如果我想要一整个班上人的信息呢,那又该怎么办?

这时候就要用到结构体数组
将多个同种类型的结构体变量整合到一起成一个数组
这就是结构体数组

代码演示:(这里只写了3名学生)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>struct student//结构体变量名{char name[10];//姓名int age;//年龄float score;//成绩}; //定义结构体类型int main(){int i;struct student S[3];//定义结构体数组for (i = 0; i < 3; i++){scanf("%s %d %f", &S[i].name, &S[i].age, &S[i].score);//对结构体成员一一输入}printf("\n\n");for (i = 0; i < 3; i++){printf("%s %d %.2f\n", S[i].name, S[i].age, S[i].score);//对结构体成员一一打印}return 0;}

运行结果:
(输入和输出:)
在这里插入图片描述
这里要注意输入和输出时结构体数组的形式

7.结构体指针(最重要)

结构体指针就是指向结构体的指针,方式与定义与其他类型变量的指针类似。
语法:struct student * ps = &S ;
将结构体变量 S 的地址赋给指针 ps
这个 ps 就是结构体指针

代码演示:

#include <stdio.h>struct student//结构体变量名{char name[20];//姓名int age;//年龄float score;//成绩}; //定义结构体类型struct student S = { "xiaobai",18,88.8 };//定义并初始化结构体变量struct student* ps = &S;//将结构体变量 S 的地址赋给指针 ps//ps的类型是struct student型

以上代码中
ps的类型为struct student型,是一个结构指针
表示着该结构体的地址

8.结构体访问操作符( -> )

上面我们学习了点操作符( . )
语法是结构体变量名.结构体成员名
而还存在一个结构体访问操作符( -> )
其语法是结构体指针->成员名

和点操作符一样, -> 也可以用其对结构体成员进行访问

代码演示:

#include <stdio.h>struct student//结构体变量名{char name[20];//姓名int age;//年龄float score;//成绩}; //定义结构体类型struct student S = { "xiaobai",18,88.8 };//定义并初始化结构体变量struct student* ps = &S;//将结构体变量 S 的地址赋给指针 ps//ps的类型是struct student型int main(){printf("%s\n%d\n%f\n\n", ps->name, ps->age, ps->score);//依次打印出结构体成员return 0;}

运行结果:
在这里插入图片描述

可以说
S.nameps -> name 完全等价
我们可以视情况对两个操作符进行使用

结语

本期资料来自于:
在这里插入图片描述https://legacy.cplusplus.com/

OK,本期的结构体详解到这里就结束了
由于文章过长,所以分了几篇文
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持
本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!!
新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!!
支持一下(三连必回QwQ)

http://www.jsqmd.com/news/173066/

相关文章:

  • 火狐浏览器报错:无法加载您的 Firefox 配置文件?一行命令 + 删除,立刻修好
  • MacOS打开应用后反复提示“XXX将对你的电脑造成伤害。你应该将它移到废纸篓”的解决办法
  • 题解:P14920 [GESP202512 六级] 道具商店
  • 【语音识别】基于K近邻分类算法的语音情感识别附Matlab代码
  • 《程序员修炼之道 - 从小工到专家》阅读笔记8
  • 2025.12.31日21:10-fastidious难取悦的, 挑剔的, 苛求的, (微生物等)需要复杂营养地
  • 【预测转矩控制三相感应电动机】实现三相感应电动机(MIT)预测转矩控制(PTC),描述了用于为变频器提供转矩参考值的控制器计算方法研究附Matlab代码、Simulink仿真
  • 《程序员修炼之道 - 从小工到专家》阅读笔记9
  • 《程序员修炼之道 - 从小工到专家》阅读笔记7
  • 雷达液位计工作原理是什么?(脉冲雷达 vs FMCW 雷达)
  • 【直流微电网保护】【本地松弛母线、光伏系统、电池和直流负载】【光伏系统使用标准的光伏模型+升压变换器】【电池使用标准的锂离子电池模型+双有源桥变换器】附Simulink仿真
  • 2025.12.31日21:10-repent后悔, 悔改, 忏悔, 悔悟
  • 【状态估计】基于FOMIAUKF、分数阶模块、模型估计、多新息系数的电池SOC估计研究附Matlab代码
  • 【植物检测】基于对称的作物田三维点云植物检测研究附Matlab代码
  • 实用指南:【Spring Boot】Spring 魔法世界:Bean 作用域与生命周期的奇妙之旅
  • 具身智能@2025:「人机共生」前夜
  • session、cookie、token的深度解析:身份认证的核心逻辑
  • 2025 零代码 AI 落地神器曝光
  • 探索 10bit 100MS/s 流水线Pipelined ADC电路:0.18um工艺下的宝藏学习资源
  • 【语音分离】基于平均谐波结构建模的无监督单声道音乐声源分离附Matlab代码
  • 【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】附Matlab代码
  • 【值得收藏】智能体(Agent)入门到精通:大模型应用开发的终极指南
  • 【破局游戏体验困局:openinstall能助力App实现什么?】
  • 一文读懂脸书创作者的赚钱通道
  • 【轴承故障诊断】加权多尺度字典学习模型(WMSDL)及其在轴承故障诊断上的应用附Matlab代码
  • AI驱动的企业创新项目管理:敏捷方法与AI的结合
  • 油管十大盈利方式,看你错过了哪些?
  • AI浪潮下的大模型学习宝典:程序员必看,高薪算法岗转型指南,建议收藏!
  • Flowjo 流式细胞分析软件介绍
  • 智能测试数据生成:提高测试效率与覆盖率