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/22 1:53:33 阅读更多 →
混合精度训练与Tensor Core加速深度学习实践

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

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

2026/7/22 1:53:33 阅读更多 →

最新新闻

ARM day5

ARM day5

1. 什么是 GIC?🔸 GIC 全称GIC(Generic Interrupt Controller,通用中断控制器),是 ARM 公司专门为 Cortex-A 系列 内核设计的一款集中式中断控制器。🔸 为什么需要 GIC?随着 SoC&…

2026/7/22 4:34:31 阅读更多 →
C++自定义内存管理:资源受限环境下的固定大小内存池实现

C++自定义内存管理:资源受限环境下的固定大小内存池实现

1. 项目概述:为什么要在资源受限环境中自定义内存管理?在嵌入式系统、物联网设备、游戏引擎或者高频交易系统里工作过的C开发者,对“内存”这个词的感受,和写桌面应用或Web后端的同行截然不同。在这些资源受限的环境里&#xff0c…

2026/7/22 4:34:31 阅读更多 →
Cocos Creator 2.x安卓打包全流程:从环境配置到APK发布实战

Cocos Creator 2.x安卓打包全流程:从环境配置到APK发布实战

1. 项目概述与核心价值最近在整理过往项目资料时,翻到了一个用Cocos Creator 2.4.15版本开发的棋牌游戏源码。这算是一个比较有“情怀”的项目了,它不像现在市面上那些动辄3D、特效拉满的重度游戏,而是专注于还原经典棋牌玩法,比如…

2026/7/22 4:34:31 阅读更多 →
Unity 3D毕设选题指南:六大前沿方向与实战避坑策略

Unity 3D毕设选题指南:六大前沿方向与实战避坑策略

1. 项目概述:为什么Unity 3D是计算机专业毕设的“黄金赛道”?又到了一年一度让计算机专业同学“头秃”的毕设选题季。看着身边同学有的在卷算法,有的在搞Web应用,你是不是也在纠结:我的毕设到底该做什么,才…

2026/7/22 4:34:31 阅读更多 →
【开题神器】专业级一键生成论文工具:研究框架、文献综述一键搭建

【开题神器】专业级一键生成论文工具:研究框架、文献综述一键搭建

每到开题季,无数本硕学子都会陷入同款困境:选题无思路、研究框架逻辑混乱、翻阅上百篇文献仍写不出合格综述、参考文献格式反复出错、熬夜搭建结构却被导师全盘打回。传统手工梳理文献、徒手搭建研究框架的模式耗时耗力,稍有疏漏就会延误开题…

2026/7/22 4:34:31 阅读更多 →
C++17 std::clamp未定义问题:从编译器支持到跨版本兼容的完整解决方案

C++17 std::clamp未定义问题:从编译器支持到跨版本兼容的完整解决方案

1. 项目概述:当std::clamp突然“消失”在C项目里,尤其是那些需要处理数值范围、做数据清洗或者UI组件值绑定的场景,std::clamp函数简直是救星。它用一行代码std::clamp(value, min, max)就能优雅地把一个值限制在指定的最小值和最大值之间&am…

2026/7/22 4:33:31 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

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

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

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

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/21 8:25:39 阅读更多 →

月新闻