C语言 · 结构体
C语言·结构体从为什么需要结构体到内存对齐一次讲透一、为什么需要结构体假设你要管理一个学生信息系统。每个学生有姓名、学号、年龄、成绩。用单独的数组char names[100][32];int ids[100];int ages[100];float scores[100];这样写几个问题一是同一个学生的数据被拆散在四个数组里逻辑上不内聚二是排序时要同步移动四个数据繁琐三是参数传递时要传四个指针冗长。你想要的是一个能把属性绑在一起的容器——这就是结构体。二、结构体的基本语法1. 定义struct Student {char name[32];int id;int age;float score;};结构体可以看作是你自己定义的新类型。struct 是关键字Student 是你给这个类型起的名字。花括号里是成员列表。2. 声明变量struct Student s1; //直接声明struct Student s2 {张三, 1001, 18, 92.5}; //初始化typedef struct Student Student; //别名Student s3; //省略struct每次写 struct Student 太麻烦第三行用 typedef 给它起了个简称 Student。也可以在定义时直接写typedef struct {int x, y;} Point;3. 访问成员s1.age 20; //点操作符printf(%s, s2.name); //读取strcpy(s1.name, 李四); //字符串成员要用strcpy结构体变量用点操作符 . 访问成员。如果是指针则用箭头 -。三、结构体与指针1. 指针访问结构体Student s {王五, 1002, 19, 88.0};Student *p s;p-age 20; //等价(*p).agep-age 是 (*p).age 的语法糖。为什么要用括号因为点的优先级比星号高——*p.age 会被解释为 *(p.age)。2. 动态分配结构体Student *p (Student*)malloc(sizeof(Student));if (p NULL) { /*分配失败*/ }strcpy(p-name, 赵六);p-id 1003;free(p);malloc 返回 void*必须强制转换为 Student*。用完记得 free。四、结构体数组结构体数组是结构体最常见的用法之一Student class[50];for (int i 0; i 50; i) {scanf(%s %d %d %f, class[i].name,class[i].id, class[i].age, class[i].score);}结构体数组排序用 qsortint cmp(const void *a, const void *b) {return ((Student*)b)-score - ((Student*)a)-score;}qsort(class, 50, sizeof(Student), cmp);qsort 是标准库函数需要你提供比较函数。不要自己写排序——qsort 已经帮你做好了。五、内存对齐结构体成员在内存中并不是紧密排列的。编译器会插入填充字节以满足对齐要求。struct Demo {char a; // 1字节int b; // 4字节char c; // 1字节};// sizeof(struct Demo) 12,不是6原因编译器按最大成员对齐——int 要4字节对齐所以 a 后面补 3 字节c 后面补 3 字节。解决方案把大的成员放前面struct Demo2 {int b; // 4字节- sizeof8char a, c; // 11,后面补2};这叫结构体对齐知道就行不要迷信 sizeof。六、嵌套结构体结构体可以包含另一个结构体typedef struct {int x, y;} Point;typedef struct {Point start, end;} Line;Line l {{0,0}, {10,10}};printf(%d, l.start.x); //访问嵌套成员但是不能包含自己类型的实例无限递归大小。可以包含自己类型的指针typedef struct Node {int data;struct Node *next; //指针大小确定} Node;这就是链表的基础。七、位段与联合体1. 位段省内存struct Flags {unsigned int is_on : 1; //只占1位unsigned int mode : 3; //只占3位unsigned int : 0; //强制对齐};位段在嵌入式开发中很常见用来表示寄存器中每个 bit 的含义。2. 联合体共享内存union Data {int i;float f;char s[4];};union Data d;d.i 0x12345678;// d.f和d.s现在被覆盖了联合体的所有成员共享同一块内存。sizeof(union) 最大成员的大小。用途节省内存、类型转换、判断大小端。八、结构体传参结构体作为函数参数时有三种方式void f1(Student s); //值传递拷贝整个结构体很慢void f2(Student *p); //指针传递只传8字节void f3(const Student *p); //只读指针不能修改原则用指针传递能用 const 就用 const。结构体可能很大值传递会在栈上拷贝整个结构体浪费内存和时间。TotoIve a feeling were not in Kansas anymore.—— The Wizard of Oz

相关新闻

英雄联盟国服换肤工具:5分钟解锁全皮肤完整指南

英雄联盟国服换肤工具:5分钟解锁全皮肤完整指南

英雄联盟国服换肤工具:5分钟解锁全皮肤完整指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server R3nzSkin国服特供版是一款专为英雄联盟国服…

2026/7/22 1:53:33 阅读更多 →
2022前端技术趋势与工程化实践全景解析

2022前端技术趋势与工程化实践全景解析

1. 2022年前端技术全景观察 2022年对于前端开发者而言是充满变革的一年。作为从业十年的全栈工程师,我观察到技术栈的迭代速度明显加快,各大框架的边界逐渐模糊,而工程化实践则向着更精细化的方向发展。这一年里,React 18带来的并…

2026/7/24 3:36:03 阅读更多 →
混合精度训练与Tensor Core加速深度学习实践

混合精度训练与Tensor Core加速深度学习实践

1. 混合精度训练的本质与价值在GPU加速的深度学习训练中,混合精度训练已经成为提升计算效率的标配技术。我第一次接触这个概念是在2018年训练一个大型视觉模型时,显存不足的问题让我不得不寻找新的解决方案。混合精度训练的核心思想很简单:让…

2026/7/24 1:19:07 阅读更多 →

最新新闻

“为什么刚写入就读不到?”——扣子数据库最终一致性陷阱深度解密(含6种业务场景补偿方案)

“为什么刚写入就读不到?”——扣子数据库最终一致性陷阱深度解密(含6种业务场景补偿方案)

更多请点击: https://intelliparadigm.com 第一章:Shell脚本的基本语法和命令 Shell脚本是Linux/Unix系统自动化任务的核心工具,以纯文本形式编写,由Shell解释器(如bash、zsh)逐行执行。其语法简洁但严谨&…

2026/7/25 0:16:41 阅读更多 →
Linux arptables 命令超全详解:ARP 防火墙 / 防欺骗看这一篇就够了

Linux arptables 命令超全详解:ARP 防火墙 / 防欺骗看这一篇就够了

1. 命令简介arptables 是 Linux 系统中用于配置内核 ARP(Address Resolution Protocol)包过滤规则表的命令行工具。它允许系统管理员设置、维护和检查针对 ARP 请求和应答包的过滤规则,常用于构建 ARP 防火墙、防止 ARP 欺骗攻击、或进行网络…

2026/7/25 0:16:41 阅读更多 →
如何快速无损剪辑视频:LosslessCut完整使用指南

如何快速无损剪辑视频:LosslessCut完整使用指南

如何快速无损剪辑视频:LosslessCut完整使用指南 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 你是否曾经面对几小时的视频素材感到无从下手?…

2026/7/25 0:16:40 阅读更多 →
手机号码定位查询系统:3步快速获取任何号码的地理位置

手机号码定位查询系统:3步快速获取任何号码的地理位置

手机号码定位查询系统:3步快速获取任何号码的地理位置 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirr…

2026/7/25 0:16:40 阅读更多 →
部署 Claude Apps Gateway,先把登录、策略和上游这条链跑通

部署 Claude Apps Gateway,先把登录、策略和上游这条链跑通

Anthropic 在 2026 年 6 月 29 日发布 Claude Apps Gateway,并提供了完整部署文档。它解决的不是“给 Claude Code 再加一层反向代理”,而是把企业身份、模型权限、客户端设置、用量归属和上游路由放进一个由企业自行运行的控制面。 官方给出的最小形态…

2026/7/25 0:16:40 阅读更多 →
3分钟学会Chrome完整网页截图:终极免费解决方案

3分钟学会Chrome完整网页截图:终极免费解决方案

3分钟学会Chrome完整网页截图:终极免费解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …

2026/7/25 0:15:40 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻