news 2026/9/3 1:48:29

为什么 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/2 20:00:12

LobeChat vs 官方ChatGPT:谁才是更适合企业的智能对话平台?

LobeChat vs 官方ChatGPT&#xff1a;谁才是更适合企业的智能对话平台&#xff1f; 在企业智能化转型的浪潮中&#xff0c;AI对话系统早已不再是“锦上添花”的功能模块&#xff0c;而是支撑客服、运维、知识管理甚至决策辅助的核心基础设施。OpenAI 的 ChatGPT 无疑是这场变革…

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

leetcode 2110

2110: 股票平滑下跌阶段的数目示例 1 的 prices[3,2,1,4]&#xff0c;按照子数组的右端点下标分组&#xff0c;有这些连续递减子数组&#xff1a;右端点 i0&#xff1a;[3]右端点 i1&#xff1a;[3,2]&#xff0c;[2]右端点 i2&#xff1a;[3,2,1]&#xff0c;[2,1]&#xff0c…

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

关于 RocketMQ 事务消息的正确打开方式 → 你学废了吗

知识回顾 本文不讲什么是 RocketMQ &#xff0c;不讲它的实现原理&#xff0c;只想和大家探讨下它的事务消息的正确使用方式 再探讨之前&#xff0c;先带大家回顾下知识点 事务消息的设计原理 RocketMQ 在 4.3.0 版中已经支持分布式事务消息&#xff0c;采用 2PC 的思想实现事务…

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

【数据结构】建堆操作:向上调整与向下调整的数学推导与性能对比

&#x1f3e0; 个人主页: EXtreme35 &#x1f4da; 个人专栏: 专栏名称专栏主题简述《C语言》C语言基础、语法解析与实战应用《数据结构》线性表、树、图等核心数据结构详解《题解思维》算法思路、解题技巧与高效编程实践目录引言I. 堆操作的时间复杂度分析1. 堆的基本性质与…

作者头像 李华
网站建设 2026/9/2 19:49:56

运维转网安选赛道:放弃渗透测试执念,安全运维才是你的舒适区!

提到运维转行网安&#xff0c;很多人第一反应是 “学渗透测试&#xff0c;当黑客”—— 但渗透测试需要大量 “攻击技术” 的学习&#xff08;如漏洞利用、Payload 构造、社会工程学&#xff09;&#xff0c;且对编程能力、逆向思维要求较高&#xff0c;很多运维从业者学了半年…

作者头像 李华
网站建设 2026/9/2 0:48:04

39、深入探索Shell的可移植性问题与扩展特性

深入探索Shell的可移植性问题与扩展特性 1. TMOUT变量对select语句的影响 TMOUT(超时)变量会对select语句产生影响。在select循环之前,将TMOUT设置为n秒,如果在这段时间内没有输入,select语句就会退出。 2. 扩展测试工具 ksh引入了由 [[ 和 ]] 界定的扩展测试工具…

作者头像 李华