news 2026/2/11 8:27:28

C :结构体详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C :结构体详解

C语言结构体(struct)超级详解
从最基础到最容易被面试官问到的进阶用法,一次性讲透!

1. 结构体最基础的概念

struct结构体标签名{类型1成员名1;类型2成员名2;...类型N 成员名N;};

最常用的三种写法(请牢牢记住这三种写法)

// 写法1(最常用、最推荐)structStudent{charname[64];intage;floatscore;chargender;};// 写法2(定义类型的同时直接创建变量)structStudent{charname[64];intage;floatscore;}stu1,stu2,stu3;// 同时创建了3个变量// 写法3(匿名结构体 —— 只能用一次)struct{charname[64];intage;}person1,person2;// 这种方式最不推荐

2. 结构体变量的几种常见定义方式对比(重要!)

写法是否有类型名可不可以多次创建变量推荐指数备注
struct Student s1;有(Student)可以★★★★★最推荐
struct Student s1 = {..};可以★★★★初始化写法
struct {..} s1;没有只能用一次★☆几乎不用
typedef struct {..} Stu;有(Stu)可以★★★★★非常常用!后面会讲
typedef struct Student Stu;有(Stu是别名)可以★★★★也很常见

3. 结构体内存对齐(★★★面试最爱考)

最核心的两句话

  1. 结构体内存对齐的根本目的提高CPU读取数据的效率(以牺牲一点内存为代价)
  2. 对齐原则(默认规则,绝大多数编译器都遵守):
每个成员相对于结构体首地址的偏移量 必须 是 自身大小 或者 编译器默认对齐数 的整数倍 整个结构体的大小 必须 是 所有成员中最大对齐数的整数倍

常用的对齐数(32/64位系统通常都是这样)

类型自身大小默认对齐数(常见)
char11
short22
int,float44
double88
指针4/84/8
结构体/共用体最大成员的对齐数

经典例题必做(请全部手算一遍)

structA{chara;// 1intb;// 4doublec;// 8shortd;// 2};structB{doublec;// 8intb;// 4chara;// 1shortd;// 2};structC{chara;//1structAb;// 按照 struct A 整体来算};

答案(请自己先算,再对):

  • sizeof(struct A) =24
  • sizeof(struct B) =16(最优写法)
  • sizeof(struct C) =48(因为里面嵌套了一个24字节的struct A)

4. 结构体初始化最常见的几种写法

structStudent{charname[64];intage;floatscore;};// 方式1 —— 推荐(C99之后支持)structStudents1={.name="张三",.age=20,.score=88.5f};// 方式2 —— 顺序初始化(最原始)structStudents2={"李四",21,92.5f};// 方式3 —— 部分初始化(其余为0)structStudents3={"王五"};// 方式4 —— 清零(最常用初始化方式)structStudents4={0};

5. 结构体指针最常用写法(非常非常重要!)

structStudent{charname[64];intage;}stu;// 方式1(最常用、最推荐)structStudent*p=&stu;// 两种等价写法(一定要非常熟练)(*p).age=18;// 方式Ap->age=18;// 方式B ← 99%的情况下都用这个!

6. 位域(Bit Field) —— 省内存神器(面试中高级常考)

structFlags{unsignedintflag1:1;// 只占1bitunsignedintflag2:1;unsignedintflag3:2;// 占2bitunsignedintflag4:4;// 总共占用 1+1+2+4 = 8 bit = 1 byte};structFlagsf={0};f.flag1=1;f.flag3=3;

位域限制(一定要记住):

  • 不能取地址(&操作)
  • 不能是double、float、long long
  • 不能跨越存储单元(不同编译器可能不同)

7. 结构体与typedef的黄金搭配(最最常用写法)

// 写法1(最推荐!几乎所有现代C代码都这么写)typedefstruct{charname[64];intage;floatscore;}Student;// 使用方式Student s1;// 直接用类型名,不用再写structStudent*p=&s1;p->age=18;// 写法2(也很常见)typedefstructStudentStudent;// 写法3(最原始,但现在很少用了)structStudent{...}typedefStudent;

8. 结构体经典面试/笔试高频题型汇总

  1. 求sizeof(结构体) (内存对齐最重要)
  2. 成员偏移量怎么求?(offsetof宏)
  3. 结构体里面嵌套结构体怎么对齐?
  4. 位域怎么用?位域的内存布局是怎样的?
  5. 结构体作为函数参数是传值还是传指针?(99.9%用指针)
  6. 结构体数组、结构体指针数组、指针数组的区别?
  7. 结构体和共用体(union)在内存占用上的本质区别?

最后送你一句最重要的话:

“只要涉及到结构体,就一定要想到内存对齐”

只要写到结构体指针,就一定要用 -> 而不是 .

只要定义结构体类型,强烈建议搭配 typedef 使用

需要我帮你把哪几种写法、哪几道经典题再展开讲得更细一点?
或者想看某一类题目(比如内存对齐)的10道经典例题?直接告诉我~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 17:17:59

数学分析与微积分

这是一个非常好的基础数学问题。你提到的这几组概念,常常让初学者感到困惑,因为它们名字很像,但侧重点完全不同。 既然你提到不是地球物理背景,我会剥离掉所有应用学科的复杂的背景,纯粹从数学思维的角度,用…

作者头像 李华
网站建设 2026/2/11 0:32:02

使用Torch编译缓存提升AI推理速度

Torch编译缓存,提升推理速度 很多模型,特别是FLUX系列的模型,会应用各种torch.compile技术/技巧来提高推理速度。 对编译函数的第一次调用会跟踪并编译代码,这会增加开销。随后的调用则运行优化后的代码,速度会显著加…

作者头像 李华
网站建设 2026/2/11 3:18:43

一场演唱会,见证追觅科技如何用创新与关怀引领未来

2月4日,苏州奥体中心体育场灯光璀璨,追觅科技与央视携手打造的“敢梦敢为追觅之夜”演唱会正式登场。这不仅是一次动人的视听盛宴,更是一份献给追觅全体员工的温暖心意。活动突破传统企业年会的活动形式,以央视级演唱会盛典&#…

作者头像 李华
网站建设 2026/2/10 9:29:05

HoRain云--域控迁移全攻略:安全转移FSMO角色

🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…

作者头像 李华
网站建设 2026/2/10 23:32:03

联想 YOGA 27 2023 独显版升级福利!3TB 存储空间解锁攻略来了

作为联想 YOGA 系列的热门机型,2023 款 YOGA 27 凭借出色的性能、高清视觉体验和灵活的使用场景,成为不少办公党、设计师和家庭用户的心头好。而近期官方推出的独显版 1TB 升 3TB 配置升级活动,更是让这款机型的性价比再上一个台阶&#xff0…

作者头像 李华
网站建设 2026/2/10 21:59:46

ThinkPad 更新 KB5012170 后弹窗 BitLocker 密钥?两种解决方法速收藏

使用 ThinkPad T14s Gen4 AMD 机型且升级 Windows 11 KB5012170 补丁的小伙伴注意啦!不少用户反馈更新后会意外弹出 “BitLocker Recovery” 页面,要求输入恢复密钥才能继续使用,突如其来的弹窗不仅打乱工作节奏,还让不少人陷入 “…

作者头像 李华