news 2026/4/16 14:44:52

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/4/16 9:04:43

YOLO26涨点改进 | 全网独家创新、注意力涨点改进篇 | CVPR 2025 | YOLO26引入SSA序列打乱注意力模块,含MSCSA二次创新模块、助力目标检测、图像分类、实例分割有效涨点

一、本文介绍 🔥本文给大家介绍将 Sequence Shuffle Attention (SSA) 模块改进 YOLO26网络模型,可以显著提升模型的性能。SSA 通过捕捉长程依赖关系、保持图像的局部性与连续性,增强了对复杂场景和小目标的检测能力。同时,SSA 高效地聚合来自不同扫描方向的特征,减少冗余…

作者头像 李华
网站建设 2026/4/16 10:38:21

HoRain云--Apache和Nginx的比较以及实用场景分析

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/4/15 19:43:16

量子机器学习验证:噪声中间尺度量子设备的算法容错测试工具

NISQ时代的测试新战场 量子机器学习(QML)正成为量子计算最具前景的应用领域,但噪声中间尺度量子(NISQ)设备的固有缺陷——如量子比特退相干、门操作误差等——导致算法输出可靠性骤降。测试从业者面临的核心挑战在于&…

作者头像 李华