深度剖析 —— 结构体
系列文章目录深度剖析数据深度剖析递归深度剖析结构体深度剖析动态内存管理深度剖析文件操作深度剖析预处理文章目录系列文章目录前言一、示例问题创建通讯录1.通讯录的需求二、结构体1.建立结构声明2.创建结构变量3.初始化结构体4.访问结构成员三、结构体数组1.创建结构数组2.数组的初始化3.数组访问成员四、嵌套结构1.结构体的嵌套2.嵌套的初始化3.嵌套访问成员五、结构体指针1.创建结构指针2.指针的初始化3.指针访问成员六、结构体的计算1.空间换取时间2.结构体的存储总结前言在设计程序时最重要的步骤之一是选择表示数据的方法。许多情况下数组已经部能很好的满足我们的需求而结构变量通过创造新的形式提高了我们表示数据的能力。一、示例问题创建通讯录1.通讯录的需求通讯录就需要一种能包含数字的数据形式而切要保持各信息的独立信息名字年龄性别电话地址功能增加删除查找修改排序二、结构体1.建立结构声明结构声明(structure declaration)描述了一个结构组织布局structPeoInfo{charName[8];charSex[4];intAge;charTelephone[12];charAddress[12];};该声明描述了一个由四个字符数组和一个整型变量组成的结构。该声明并未创建实际的数据只是描述了该对象由什么组成。从本质上看结构声明创建了一个名为struct PeoInfo的新类型(int double等类型等价) 。struct它表明其后的是一个结构struct PeoInfo则是这个结构的名称2.创建结构变量结构变量定义了一个struct PeoInfo类型的变量structPeoInfoMail;此时此刻才向堆栈申请了一块sizeof(struct PeoInfo)大小的空间(这里是为了便于理解所以恰好设置了40个字节的大小布局后面会有结构体大小的计算详解)。3.初始化结构体struct PeoInfo类型也可以直接进行初始化structPeoInfoMail{小明,男,18,11111111111,某小区};struct PeoInfo和int等其他类型一样可以直接进行赋值它的内容需要由花括号括起来各初始化项由逗号进行分隔。4.访问结构成员结构体成员的基本访问(对象.访问成员或指针-访问成员)printf(%s,Mail.Name);printf(%s,Mail.Sex);printf(%d,Mail.Age);printf(%s,Mail.Telephone);printf(%s,Mail.Address);本质上Name、Sex、Age、Telephone、Address都是struct PeoInfo的下标就像数组的下标0、1、2、3一样数组是用[ ]来访问所在下标位置的元素 而结构体则是用.和-来访问成员。三、结构体数组1.创建结构数组创建结构数组创建明其他类型的数组类似structPeoInfoMail[100];与其他类型一样数组的每一个元素又是struct PeoInfo类型的元素。2.数组的初始化与其他数组一样只能在创建的时被直接初始化structPeoInfoMail[20]{{小明,男,18,11111111111,某小区},{小红,女,18,11111111111,某小区}};下面的这种写法是错误的Mail[0]{小明,男,18,11111111111,某小区};//错误示例3.数组访问成员找到结构数组的某一个元素的下标进行访问printf(%s,Mail[0].Name);printf(%s,Mail[0].Sex);printf(%d,Mail[0].Age);printf(%s,Mail[0].Telephone);printf(%s,Mail[0].Address);四、嵌套结构1.结构体的嵌套当我们需求更丰富时就需要在结构体中嵌套一层结构体//成员信息structPeoInfo{charName[8];charSex[4];intAge;charTelephone[11];charAddress[13];};//通讯录structContact{structPeoInfoData[MAX];//存放增加进来的人的信息(此处为结构体的嵌套)intcount;//记录当前通讯录中有效信息的个数}Contact;2.嵌套的初始化嵌套式结构体建议一个一个进行赋值而非直接初始化//方法一strcpy(Mail.Data[0].Name,小明);strcpy(Mail.Data[0].Sex,男);Mail.Data[0].Age18;strcpy(Mail.Data[0].Telephone,11111111111);strcpy(Mail.Data[0].Address,某小区);//方法二scanf(%s,Mail.Data[0].Name);scanf(%s,Mail.Data[0].Sex);scanf(%d,Mail.Data[0].Age);scanf(%s,Mail.Data[0].Telephone);scanf(%s,Mail.Data[0].Address);当结构体过于复杂时不建议像下面代码这样直接初始化当嵌套更加复杂时直接初始化会非常困难。structContactMail{{{小明,男,18,11111111111,某小区},{小红,女,18,11111111111,某小区}},20};3.嵌套访问成员嵌套成员依然是一层一层的去访问(与前面一模一样)printf(%s,Mail.Data[0].Name);printf(%s,Mail.Data[0].Sex);printf(%d,Mail.Data[0].Age);printf(%s,Mail.Data[0].Telephone);printf(%s,Mail.Data[0].Address);五、结构体指针1.创建结构指针指向结构体的指针structContact*PMail;2.指针的初始化当结构体过于复杂时建议一个一个进行赋值//方法一 (结构体过于复杂时不推荐该方法)structContactMail{{{小明,男,18,11111111111,某某小区},{小红,女,18,11111111111,某某小区}},20};structContact*PMailMail;//方法二strcpy(PMail-Data[0].Name,小明);strcpy(PMail-Data[0].Sex,男);PMail-Data[0].Age18;strcpy(PMail-Data[0].Telephone,11111111111);strcpy(PMail-Data[0].Address,某小区);//方法三scanf(%s,PMail-Data[0].Name);scanf(%s,PMail-Data[0].Sex);scanf(%d,PMail-Data[0].Age);scanf(%s,PMail-Data[0].Telephone);scanf(%s,PMail-Data[0].Address);3.指针访问成员访问时可以*指针.或-直接访问printf(%s,PMail-Data[0].Name);printf(%s,PMail-Data[0].Sex);printf(%d,PMail-Data[0].Age);printf(%s,PMail-Data[0].Telephone);printf(%s,PMail-Data[0].Address);六、结构体的计算1.空间换取时间效率至上在尽可能不浪费空间的情况下尽可能的提高运行的效率来达到我们想要的结果。所以在结构体的存储方面我们选择牺牲较少的空间来降低计算机计算的时间复杂度便于更快的运行程序。2.结构体的存储存储法则第一个成员在与结构体变量偏移量为0的地址处。其他成员变量要对齐到某个数字对齐数的整数倍的地址处。(对齐数 编译器默认的一个对齐数 与 该成员大小的较小值)。结构体总大小为最大对齐数每个成员变量都有一个对齐数的整数倍。如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处。结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。计算结构体的偏移量offsetof (type, 成员)修改默认最大对齐数8#pragma pack(最大对齐数)一般设置为2的n次方//计算下面代码的大小structBook{chartitle[3];intcount;shortvalue;};题解int的对齐数是4而char占了3个字节显然不是4的整数倍于是浪费1个空白字节从而凑出4个字节恰好为int对齐数4的整数倍此时此刻占了8个字节。short的对齐数是2个字节8恰好是2的整数倍所以short紧跟在int后面占2个字节此时占用10个字节但10并不是最大对齐数4(默认对齐数和int的对齐数取较小值)的整数倍所以还要再浪费2个空白字节最终结构体占用12个字节的大小。总结结构体提供了再相同的数据对象中存储多个不同类型数据项的方法。可以创建一个具体的结构模板并声明相应的变量。通过.运算符和-运算符可以访问结构中的各个成员。它使得我们在处理问题时有更佳灵活的方式去解决。

相关新闻

深度剖析 —— 动态内存管理

深度剖析 —— 动态内存管理

系列文章目录 深度剖析:数据 深度剖析:递归 深度剖析:结构体 深度剖析:动态内存管理 深度剖析:文件操作 深度剖析:预处理 文章目录系列文章目录前言一、示例问题:通讯录的容量1.通讯录的需求二…

2026/8/13 16:44:55 阅读更多 →
深度剖析 —— 文件操作

深度剖析 —— 文件操作

系列文章目录 深度剖析:数据 深度剖析:递归 深度剖析:结构体 深度剖析:动态内存管理 深度剖析:文件操作 深度剖析:预处理 文章目录系列文章目录前言一、示例问题:通讯录的信息存储1.通讯录的需…

2026/8/13 16:44:55 阅读更多 →
Python:JIRA操作

Python:JIRA操作

curlcurl -i https://jira.******.com/ 200 !200:检查server地址curl -i -u "username:password" https://jira.******.com/python jira.exceptions.JIRAError: JiraError HTTP 401 401,"没证明你是谁"(认证失败&#xf…

2026/8/13 16:43:55 阅读更多 →

最新新闻

你的电脑健康管家:LibreHardwareMonitor硬件监控完全指南

你的电脑健康管家:LibreHardwareMonitor硬件监控完全指南

你的电脑健康管家:LibreHardwareMonitor硬件监控完全指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项目地址…

2026/8/13 19:02:17 阅读更多 →
USB Sniffer Lite高级技巧:触发机制与数据包过滤实用指南

USB Sniffer Lite高级技巧:触发机制与数据包过滤实用指南

USB Sniffer Lite高级技巧:触发机制与数据包过滤实用指南 【免费下载链接】usb-sniffer-lite A simple USB sniffer based on Raspberry Pi RP2040 项目地址: https://gitcode.com/gh_mirrors/us/usb-sniffer-lite USB Sniffer Lite是一款基于Raspberry Pi R…

2026/8/13 19:02:17 阅读更多 →
深入探索Linux内核的Per-CPU变量:多核时代的性能加速器

深入探索Linux内核的Per-CPU变量:多核时代的性能加速器

深入探索Linux内核的Per-CPU变量:多核时代的性能加速器 【免费下载链接】linux-insides A book-in-progress about the Linux kernel and its insides. 项目地址: https://gitcode.com/gh_mirrors/li/linux-insides 在多核处理器成为主流的今天,L…

2026/8/13 19:02:17 阅读更多 →
5分钟成为Windows功能管理大师:ViVeTool终极配置指南

5分钟成为Windows功能管理大师:ViVeTool终极配置指南

5分钟成为Windows功能管理大师:ViVeTool终极配置指南 【免费下载链接】ViVe C# library and console app for using new feature control APIs available in Windows 10 version 2004 and newer 项目地址: https://gitcode.com/gh_mirrors/vi/ViVe 你知道吗&…

2026/8/13 19:02:17 阅读更多 →
实用指南:如何部署高性能Bifrost AI网关并优化LLM请求路由

实用指南:如何部署高性能Bifrost AI网关并优化LLM请求路由

实用指南&#xff1a;如何部署高性能Bifrost AI网关并优化LLM请求路由 【免费下载链接】bifrost Fastest enterprise AI gateway (50x faster than LiteLLM) with adaptive load balancer, cluster mode, guardrails, 1000 models support & <100 s overhead at 5k RPS.…

2026/8/13 19:02:17 阅读更多 →
如何用Kikoeru-Express在10分钟内搭建个人音乐流媒体服务器?

如何用Kikoeru-Express在10分钟内搭建个人音乐流媒体服务器?

如何用Kikoeru-Express在10分钟内搭建个人音乐流媒体服务器&#xff1f; 【免费下载链接】kikoeru-express kikoeru 后端 项目地址: https://gitcode.com/gh_mirrors/ki/kikoeru-express 你是否曾为管理大量音声文件而烦恼&#xff1f;想要一个专属的音乐服务器来整理、…

2026/8/13 19:01:17 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者&#xff0c;或者正准备踏入这个领域&#xff0c;那么Visual Studio&#xff08;后面简称VS&#xff09;绝对是你绕不开的伙伴。但有时候&#xff0c;这个伙伴会跟你开一个不大不小的玩笑&#xff1a;你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南&#xff1a;RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑&#xff1a;baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码&#xff08;维护中 rm repo&#xff09; 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片&#xff1a;Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身&#xff0c;而应重视模型外的系统搭建&#xff0c;即Harness。提出AgentModelHarness的实用公式&#xff0c;详细介绍Harness的四个层次&#xff1a;持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →