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

C语言log9:面向对象思维启蒙:结构体 (Struct) 基础全解

面向对象思维启蒙:结构体 (Struct) 基础全解

当我们需要将不同类型的数据打包在一起,形成一个具有实际意义的“对象”时,结构体(Struct)就派上用场了。本篇博客将详细梳理结构体的三种定义姿势、嵌套初始化的细节,以及如何通过指针高效访问结构体成员。

1. 结构体的三种定义方法

在 C 语言中,定义结构体有多种书写习惯。你的笔记中记录了最典型的三种方式:

方式一:匿名结构体

这种方式没有给结构体命名,直接在后面定义了变量 ab
缺点:因为没有名字,以后在代码的其他地方无法再用这个模板创建新的变量了。通常只用在一次性消费的场景。

// 定义的同时顺便创建全局变量 a 和 b
struct {int a;int b;int arr[10];char name[10];
} a, b; [cite_start]// [cite: 1401, 1402]

方式二:标准命名结构体

给结构体起了一个名字 node。这样以后就可以用 struct node var_name; 来随处创建新变量了。

struct node {int num;char ol[10];
} c, d, e; [cite_start]// 定义模板的同时,创建变量 c, d, e [cite: 1402]int main() {struct node b = { 30, "hello" }; [cite_start]// 后续使用标准方式创建变量 b [cite: 1402]return 0;
}

方式三:使用 typedef 起别名(🔥 强烈推荐!)

这是实际工程中最常用的写法。利用 typedef,我们把冗长的 struct {...} 直接重命名为 node1。以后创建变量时,连 struct 这个关键字都可以省掉!

typedef struct {int hello;char hi[10000];
} node1; [cite_start]// 这里的 node1 不再是变量名,而是这个结构体的新类型名! [cite: 1402]int main() {node1 d = { 34335, "hello world!" }; [cite_start]// 直接用 node1 创建变量 d,极其清爽 [cite: 1402]return 0;
}

2. 结构体的嵌套与初始化

[cite_start]结构体不仅可以包含基本数据类型,还可以把另一个结构体当作自己的成员 [cite: 1406]。

在对嵌套结构体进行初始化时,最规范的做法是利用大括号 {} 的层级来对应结构体的层级

[cite_start]struct node2 { // [cite: 1407]int d;     [cite_start]// [cite: 1408]int e;     [cite_start]// [cite: 1410]
}; [cite_start]// [cite: 1409][cite_start]struct node1 { // [cite: 1411]int a;     [cite_start]// [cite: 1412]int b;     [cite_start]// [cite: 1413]struct node2 c; [cite_start]// 嵌套了 node2 作为成员 [cite: 1414]int* p;    [cite_start]// [cite: 1415]
}; [cite_start]// [cite: 1416][cite_start]int main() { // [cite: 1417][cite_start]// 再次使用大括号,对内部的结构体成员 c 进行精准初始化 [cite: 1419]struct node1 w = { 20, 30, {30, 50}, NULL }; [cite_start]// [cite: 1419]// 链式访问嵌套成员printf("%d", w.c.d); [cite_start]// 打印结果:30 [cite: 1420]return 0; [cite_start]// [cite: 1421]
[cite_start]} // [cite: 1422]

3. 直接访问 vs 间接访问(指针访问)

这是 C 语言中绝对的重点考点。访问结构体内部的数据有两种操作符:

直接访问:点操作符 .

[cite_start]如果你手里拿到的是一个结构体变量本身,请使用点操作符 . 来进行成员变量的访问,这称为直接访问 [cite: 1423]。例如:node.b

间接访问:箭头操作符 ->

[cite_start]如果你手里拿到的是一个指向结构体的指针,则必须使用箭头操作符 -> 进行间接访问 [cite: 1424]。例如:p->b

回顾复习:结合我们在《数组》篇学到的知识,由于结构体成员 char c[120] 是一个字符数组,它的名字代表首地址,所以不能直接用 = 赋值字符串,必须使用 <string.h> 里的 strcpy 函数。

#include<stdio.h>
[cite_start]#include<string.h> // 提供 strcpy 支持 [cite: 1425][cite_start]struct nodo { // [cite: 1425]int a; [cite_start]// [cite: 1425]int b; [cite_start]// [cite: 1425]char c[120]; [cite_start]// [cite: 1425]
}; [cite_start]// [cite: 1425][cite_start]int main() { // [cite: 1425]struct nodo node; [cite_start]// 创建结构体变量 [cite: 1425]struct nodo* p = &node; [cite_start]// 创建指针 p,指向 node 的地址 [cite: 1425]p->a = 10; [cite_start]// 通过指针间接赋值 [cite: 1425]p->b = 114514; [cite_start]// [cite: 1425]strcpy(p->c, "hello again"); [cite_start]// 给结构体内的字符数组拷贝字符串 [cite: 1425]// 验证:无论是通过变量名直接访问(.),还是指针间接访问(->),操纵的都是同一块内存printf("%d %d %s %s", node.b, p->b, node.c, p->c); [cite_start]// [cite: 1425][cite_start]// 输出结果完全一致: 114514 114514 hello again hello again [cite: 1426]return 0; [cite_start]// [cite: 1425]
}

声明:本博客由gemini基于laobie本地obsidian笔记转写,意在将obsidian内置图片转化为了纯文本或表格描述,便于博客上传

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

相关文章:

  • YOLO-World实战复现:从环境配置到Demo运行的全流程避坑指南
  • 南方网通讯灵GEO服务重庆代理口碑好的有哪些,费用低吗 - 工业设备
  • C语言_log8:内存越界陷阱与 VS 调试高效技巧
  • log7:函数机制、多文件编程与 static
  • 2026北京茅台老酒回收行业权威排名发布:三大品牌实力领衔,服务口碑双丰收 - 资讯焦点
  • 不用安装LabVIEW也能运行?详解3种LabVIEW程序分发方式的适用场景
  • ChatTTS代码实战:如何通过优化语音合成流程提升3倍处理效率
  • uni-app的生命周期
  • 2026年四川短视频代运营公司推荐:新媒体孵化/视频号/快手孵化/短视频陪跑服务商精选 - 品牌推荐官
  • 如何在普通PC上高效运行macOS:完整实战指南
  • 2026河北PVC彩壳厂家高性价比评测深度解析 - 资讯焦点
  • B站视频缓存转换完整指南:三步解锁m4s格式限制
  • OpenClaw+Qwen3.5-9B多模态实践:截图识别与信息提取自动化
  • 品牌对比:哪些XRF镀层测厚仪综合实力强、用户口碑好? - 品牌推荐大师
  • lessmsi:开源MSI文件提取与分析工具全攻略
  • 如何在Apple Silicon Mac上完美运行iOS游戏:PlayCover终极指南
  • 阿里达摩院AI Earth平台功能调整公告(下线数据检索功能、下线处理与分析功能中的开发者模式、下线模型训练功能和下线应用空间功能等)
  • 紧致眼霜哪个效果好些?2026深度测评抗衰好物排行榜:表层滋养+肌底抗衰 - 资讯焦点
  • 2026农化行业旋盖机优质厂家推荐指南 - 资讯焦点
  • 2026 Java企业AI开发:JBoltAI的实用选型
  • Python测试AI化倒计时:PyPI最新包testgen-ai已突破10万下载量,但93.4%用户仍在用错误配置方式
  • AlienFX Tools:终极Alienware设备控制解决方案,释放硬件全部潜能
  • mybatis增删改查
  • 2026热门铝镁质保温板品牌评测深度解析 - 资讯焦点
  • 【一周安全资讯0321】工信部启动工业数据筑基行动,建设面向AI赋能的高质量行业数据集;360回应“安全龙虾”私钥泄露事件
  • 从 LLM 到 Multi-Agent:一文搞懂 AI Agent 的本质
  • Chord - Ink Shadow 效果实测:复杂技术文档翻译与摘要质量评估
  • 2026年重庆热门GEO优化服务公司排名,GEO优化对数据分析好处多 - myqiye
  • CUDA性能指标
  • 深度解析Magpie:Windows窗口缩放工具的架构设计与性能调优