news 2026/9/11 4:41:41

为什么 C 一定要用二级指针?一次彻底讲清

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么 C 一定要用二级指针?一次彻底讲清

初学者最痛苦的问题:
“我明明在函数里把 head 改了,为什么外面没变?”
答案就是:你只改了“副本”。

1)先用一句话说清:C 默认都是值传递

void f(int x){ x = 10; }

外面变量不会变,因为x是拷贝。

指针也是一样:

void g(Node* head){ head = newHead; } // head 也是拷贝

2)什么时候必须用二级指针?

只要你想在函数里修改:

  • 头指针head自身
    就必须用Node**

典型场景:

  • 头插
  • 删除头节点
  • 初始化空链表(第一次插入)
  • 清空链表(把 head 置 NULL)

3)用“头插”做对比,一眼就懂

❌ 错误:只传 Node*

void push_front_bad(Node* head, int x){ Node* n = create_node(x); n->next = head; head = n; // 只改了形参副本 }

外面的head不会变。

✅ 正确:传 Node**

void push_front(Node** head, int x){ Node* n = create_node(x); n->next = *head; *head = n; // 改的是“外部 head 的地址指向的值” }

4)二级指针到底是什么?

如果:

  • headNode*(指向节点)

  • 那么&head就是Node**(指向“指针变量 head”)

所以你传Node**本质就是:

把“指针变量本身”交给函数修改

5)极简 Demo(建议你复制运行)

#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* create_node(int x){ Node* n = (Node*)malloc(sizeof(Node)); n->data = x; n->next = NULL; return n; } void push_front_bad(Node* head, int x){ Node* n = create_node(x); n->next = head; head = n; } void push_front(Node** head, int x){ Node* n = create_node(x); n->next = *head; *head = n; } int main(){ Node* head = NULL; push_front_bad(head, 1); printf("after bad: %p\n", (void*)head); // NULL push_front(&head, 1); printf("after good: %p\n", (void*)head); // 非NULL return 0; }

下一篇: 用 C 实现一个简化版 MessageQueue

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

缓存与数据库一致性解决方案深度解析

一、业务场景与挑战1.1 12306余票查询场景在12306系统中&#xff0c;用户需要实时查询列车不同站点、不同座位类型的余票信息。为提升查询性能&#xff0c;我们将余票信息缓存在Redis中。但在用户下单支付时&#xff0c;需要同时更新数据库和缓存中的余票数据。核心挑战&#x…

作者头像 李华
网站建设 2026/9/11 13:07:31

消息队列真仙:我的道念支持最终一致性

瑶池圣地&#xff0c;飞升台。九天罡风如刀&#xff0c;撕扯着白玉砌成的古老平台。万丈雷云在头顶凝聚&#xff0c;电蛇狂舞&#xff0c;酝酿着最后一重、也是最凶险的“九霄寂灭神雷”。台下&#xff0c;瑶池众仙娥、各方观礼道友&#xff0c;皆屏息凝神&#xff0c;目光聚焦…

作者头像 李华
网站建设 2026/9/10 19:50:00

Spring Boot项目推送Gitee全流程(进阶)

对于国内的Java开发者而言&#xff0c;将Spring Boot项目托管到Gitee是一个常见且高效的选择。本文将以IntelliJ IDEA为开发环境&#xff0c;手把手带你完成从项目初始化到代码成功推送的全过程&#xff0c;并澄清关键概念、解释核心命令&#xff0c;助你彻底掌握。 一、核心概…

作者头像 李华
网站建设 2026/9/10 19:01:39

Java毕设项目:基于Springboot大学校园自习室教室座位预约网站设计与实现基于springboot高校自习室预约系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/9 22:19:33

JAVA打造同城羽馆预约,一键畅享运动

利用 JAVA 开发同城羽毛球馆预约系统&#xff0c;可以结合 高并发处理、实时交互、多端适配 等特性&#xff0c;打造一个 “一键预约、智能匹配、全流程数字化” 的运动服务平台&#xff0c;让用户轻松畅享羽毛球运动的乐趣。以下是具体实现方案与核心功能设计&#xff1a;一、…

作者头像 李华
网站建设 2026/9/10 6:50:30

经验贴 | 科学制定招聘需求与预算:HR 必看的逻辑与实操要点

招聘是企业补充人才、保障发展的核心环节&#xff0c;而科学制定招聘需求与预算则是招聘工作高效落地的前提。不少 HR 在实际工作中会陷入 “需求模糊导致招聘偏差”“预算失控造成资源浪费” 的困境&#xff0c;既影响招聘效率&#xff0c;也难以匹配业务发展诉求。本文结合实…

作者头像 李华