news 2026/9/3 3:43:55

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/9/2 22:10:14

可再生能源调度:破解数据中心绿电匹配的测试困局

随着全球数据中心耗电量突破1000TWh(占全球用电量3%),绿电匹配成为实现"零碳数据中心"的核心技术。然而,83%的调度失误源于未检出的软件逻辑缺陷,测试工程师正面临三重核心挑战: 一、绿电调度系…

作者头像 李华
网站建设 2026/9/2 22:20:55

上下文工程(Context Engineering)

本文整理自 LangChain 博客《Context Engineering for Agents》」更自然 https://blog.langchain.com/context-engineering-for-agents/ 随着大语言模型(LLM)在智能体(Agent)系统中的广泛应用,如何有效管理有限的上下…

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

JAX JIT编译:超越即时编译的静态计算图革命

JAX JIT编译:超越即时编译的静态计算图革命 摘要 在深度学习框架激烈竞争的今天,JAX凭借其独特的函数式编程范式和对高性能计算的深度优化脱颖而出。其中,Just-In-Time(JIT)编译作为JAX最核心的特性之一,不…

作者头像 李华