【2个月 C 语言从入门到精通:零基础系统教程】第十四讲:⾃定义类型:结构体
文章目录📖 前言1. 结构体类型的声明与定义1.1 结构体基本概念与声明语法1.2 结构体变量的创建和初始化1.2.1 按照结构体成员定义的顺序初始化(最常用)1.2.2 按照指定顺序初始化(C99标准支持)1.3 结构体的特殊声明(匿名结构体)1.4 结构的自引用(链表节点的实现)1.4.1 错误的示范1.4.2 正确的自引用(包含自身类型指针)1.4.3 结合 typedef 重命名的典型陷阱与解决方案2. 结构体内存对齐2.1 结构体内存对齐规则核心对齐规则详细代码示例与内存计算过程练习1:对比 S1 与 S2(成员顺序影响大小)练习2:带有 double 的 S3 与结构体嵌套 S42.2 为什么存在内存对齐?2.3 修改默认对齐数 (#pragma pack)详细代码示例:2.4 结构体传参详细代码示例:3.1 什么是位段(定义与语法)代码示例与经典面试题3.2 位段的内存分配详细代码示例与内存解析3.3 位段的跨平台问题(重点规避)3.4 位段的应用(网络协议实践)3.5 位段使用的注意事项( 地址符限制)🎯 总结一、结构体基础二、内存对齐机制三、传参优化四、位段技术关键要点回顾📖 前言在C语言编程中,结构体(Struct)是一种非常重要的复合数据类型,它允许我们将不同类型的数据组合成一个整体。无论是开发操作系统、数据库系统,还是进行嵌入式开发,结构体都扮演着至关重要的角色。然而,结构体的使用并非简单的成员组合,其中涉及内存对齐、传参效率、位段优化等深层次概念,这些正是许多C语言学习者和开发者容易忽视或理解不透彻的地方。本文将从结构体的基础声明开始,逐步深入到内存对齐原理、传参优化策略,最后探讨位段这一特殊用法。通过详细的代码示例和内存布局分析,帮助读者全面掌握结构体的核心知识点,理解底层内存机制,并学会在实际项目中合理运用结构体优化程序性能。无论你是C语言初学者,还是有一定经验的开发者,相信本文都能为你提供有价值的参考和启发。1. 结构体类型的声明与定义1.1 结构体基本概念与声明语法结构体(Struct)是一些值的集合,这些值被称为成员变量。结构体的每个成员可以是不同类型的变量(如整型、字符、数组,甚至其他结构体)。基本声明语法格式:structtag// 结构体标签(Tag){member-list;// 成员变量列表}variable-list;// 变量列表(可在此处直接创建变量,也可省略)⚠️关键注意点:member-list 右大括号}后面的分号绝对不能丢,否则编译器会报错。示例(描述一个学生):structStu{charname[20];// 名字intage;// 年龄charsex[5];// 性别charid[20];// 学号};// 这里的分号至关重要1.2 结构体变量的创建和初始化结构体类型相当于"图纸",真正使用需要创建变量并赋值。C语言提供了两种主流的初始化方式。1.2.1 按照结构体成员定义的顺序初始化(最常用)直接在大括号{}中按成员定义的顺序填入初值。要注意数据类型要匹配,字符数组需要给字符串字面量。#includestdio.h// 假设上方已定义 struct Stuintmain(){// 顺序初始化:按 name - age - sex - id 的顺序给值structStus1={"张三",20,"男","20230818001"};printf("name: %s\n",s1.name);printf("age : %d\n",s1.age);printf("sex : %s\n",s1.sex);printf("id : %s\n",s1.id);return0;}1.2.2 按照指定顺序初始化(C99标准支持)利用.成员名 = 值的语法,可以打乱顺序进行初始化。未被指定的成员会自动被初始化为0(或空指针、空字符)。intmain(){// 指定初始化:不仅打乱了顺序,还省略了部分字段structStus2={.age=18,.name="李四",.id="20230818002"};// 此时 s2.sex 未被赋值,由于是全局/局部静态或本地初始化,会被自动初始化为空字符串 "\0"printf("name: %s\n",s2.name);// 输出: 李四printf("age : %d\n",s2.age);// 输出: 18printf("sex : %s\n",s2.sex);// 输出: (空)printf("id : %s\n",s2.id);// 输出: 20230818002return0;}1.3 结构体的特殊声明(匿名结构体)如果我们在声明结构体时省略了结构体标签(tag),这就是匿名结构体。示例定义:// 匿名结构体类型 xstruct{inta;charb;floatc;}x;// 另一个看起来一模一样的匿名结构体类型,创建了数组 a 和指针 pstruct

相关新闻

【课程设计/毕业设计】基于 Spring Boot 的政务服务绩效统计管理系统的设计与实现 基于 Spring Boot 的一体化电子政务业务管理系统【附源码、数据库、万字文档】

【课程设计/毕业设计】基于 Spring Boot 的政务服务绩效统计管理系统的设计与实现 基于 Spring Boot 的一体化电子政务业务管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 1:35:32阅读更多 →
Claude Code Token 监控指南:实时追踪用量、防止上下文溢出

Claude Code Token 监控指南:实时追踪用量、防止上下文溢出

Claude Code Token 监控指南:实时追踪用量、防止上下文溢出 目录 为什么需要监控 Token 核心监控命令详解 /context:上下文可视化仪表盘 /usage:API 配额与用量查询 /cost:实时成本统计

2026/6/18 1:30:31阅读更多 →
PyTorch 结合 ROCm 7.x,本地调试大模型的正确姿势

PyTorch 结合 ROCm 7.x,本地调试大模型的正确姿势

环境准备:跳出“依赖地狱”的正确起手式 很多习惯在 NVIDIA 生态下开发的工程师,初次接触 AMD Instinct GPU 时,最容易在第一步就栽跟头。大家习惯了 pip install torch 的一键顺滑,但在 ROCm 7.x 环境下,如果直接照搬…

2026/6/18 1:30:31阅读更多 →
LangGPT结构化提示词完整指南:5个步骤让AI成为你的专业助手

LangGPT结构化提示词完整指南:5个步骤让AI成为你的专业助手

LangGPT结构化提示词完整指南:5个步骤让AI成为你的专业助手 【免费下载链接】LangGPT LangGPT: Empowering everyone to become a prompt expert! 🚀 📌 结构化提示词(Structured Prompt)提出者 📌 元提示词…

2026/6/18 2:45:37阅读更多 →
从零到一:OpCore Simplify如何用智能自动化重塑黑苹果配置体验

从零到一:OpCore Simplify如何用智能自动化重塑黑苹果配置体验

从零到一:OpCore Simplify如何用智能自动化重塑黑苹果配置体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCore配置而…

2026/6/18 2:45:37阅读更多 →
半导体设备EAP系统开发实战——SECS/GEM协议从入门到Python完整实现

半导体设备EAP系统开发实战——SECS/GEM协议从入门到Python完整实现

在半导体制造中,EAP(Equipment Automation Programming,设备自动化编程)系统是连接MES与物理设备的桥梁。它通过SECS/GEM协议与设备通信,实现配方下发、数据采集、设备控制、事件通知等核心功能。本文将带你从零搭建一…

2026/6/18 2:45:37阅读更多 →
AI多Agent协同工作流:LlamaIndex+Bedrock+Slack工程实践

AI多Agent协同工作流:LlamaIndex+Bedrock+Slack工程实践

1. 这不是又一个“AI聊天机器人”,而是一套能自主协同的数字工作流你有没有遇到过这样的场景:销售同事在Slack里发来一条客户新需求,内容零散、夹杂截图和语音转文字;与此同时,产品文档刚更新了API变更说明&#xff0c…

2026/6/18 2:45:37阅读更多 →
AI网关与传统网关的差异

AI网关与传统网关的差异

从流量中介到智能决策中枢:AI网关与传统网关的本质差异引言 网关作为重要的中间件,在传统业务中扮演着流量治理、路由转发、协议转换、安全防护等功能。从早期的反向代理到微服务时代的API网关,再到今天的AI网关,这一技术物种经历…

2026/6/18 2:45:37阅读更多 →
BiliTools完整指南:高效构建个人B站资源库的终极方案

BiliTools完整指南:高效构建个人B站资源库的终极方案

BiliTools完整指南:高效构建个人B站资源库的终极方案 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 在…

2026/6/18 2:40:36阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →