当前位置: 首页 > news >正文

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道经典例题?直接告诉我~

http://www.jsqmd.com/news/344544/

相关文章:

  • YOLOv13涨点改进 | 独家创新,特殊场景检测篇 | TGRS 2025 | 引入FAENet特征自适应增强网络,专注于恶劣天气条件下的目标检测(低光场景、雾天场景、雨雪场景、复杂环境等)即插即用
  • 公平竞争审查制度DID (2011-2024)
  • Java面试还问八股文吗?什么是八股文?
  • HoRain云--[特殊字符] 大模型服务容器化部署全流程(Docker Compose 实战版)
  • 摆脱论文困扰! 9个一键生成论文工具测评:本科生毕业论文+开题报告高效写作指南
  • 2026年贵阳靠谱的防腐木花箱,防腐木长廊,防腐木平台厂家采购推荐榜单 - 品牌鉴赏师
  • HoRain云--Linux系统服务管理终极指南
  • 深入剖析JVM类加载机制:从字节码到可执行对象的魔法之旅
  • YOLO26涨点改进 | 全网独家创新、特征融合改进篇 | CVPR 2024 顶会| 引入MFM调制融合模块, LEGM局部到全局模块,二者共同合作,多种创新改进,助力YOLO26高效涨点
  • 2026年比较好的企业费控数字化系统/上海企业费控行业应用解析 - 品牌宣传支持者
  • 2026年四川靠谱的政策补贴驳回申诉代办公司排名,值得选哪家 - myqiye
  • 摆脱论文困扰!一键生成论文工具 千笔·专业论文写作工具 VS Checkjie 专为继续教育设计
  • YOLO26涨点改进 | 全网独家创新-注意力改进篇 | TGRS 2025 | YOLO26 引入FSSA傅里叶域稀疏自注意力,含多种改进,助力遥感小目标检测、图像分类、实例分割、图像超分有效涨点
  • 2026年天津口碑好的老酒回收公司排名,绿色茅台酒回收选哪家 - 工业品网
  • 一场演唱会,见证追觅科技如何用创新与关怀引领未来
  • 学霸同款10个降AIGC平台 千笔AI帮你高效降AI率
  • ‌智慧校园服务承诺:以快速响应与高效解决为核心‌
  • Palo Alto Panorama 11.2 Virtual Appliance for ESXi, KVM - Palo Alto Networks 防火墙统一管理
  • AI论文工具有哪些?8款写论文的AI排行榜,让你毕业论文写作少走弯路! - 掌桥科研-AI论文写作
  • YOLO26涨点改进 | 全网独家创新,细节涨点改进篇 | TGRS2025顶刊 | YOLO26利用GMM和LMM两个创新点,提取空间-频谱信息,适用于YOLO26检测小目标或边界模糊的区域!
  • 情人节的压力与日俱增,DoorDash推出一首歌和解决方案
  • 【SAE出版 | 有ISSN号 |EI,scopus双检索】第二届智慧交通与未来出行国际会议(ITFM 2026)
  • LVM分区创建、数据迁移与重新挂载操作文档
  • HoRain云--域控迁移全攻略:安全转移FSMO角色
  • 什么是跨网文件交换?从原理到实践,轻松掌握跨网传输技巧 - 飞驰云联
  • HoRain云--Linux安装黑屏终极解决方案
  • 春节归途:2026年天象版图与平安锦囊
  • HoRain云--Linux开发环境离线安装全攻略
  • AI论文工具有哪些?2026年精选8款写论文的AI软件推荐,帮你搞定各类学术论文! - 掌桥科研-AI论文写作
  • 百考通AI PPT:当智能生成遇上高效创作,演示文稿的体验革命