news 2026/5/26 8:36:15

为什么 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/5/26 1:09:59

PyTorch安装后如何加载Qwen3-32B?常见问题汇总

PyTorch安装后如何加载Qwen3-32B&#xff1f;常见问题汇总 在当前大模型快速落地的背景下&#xff0c;越来越多开发者尝试将高性能语言模型部署到实际业务系统中。尤其是像 Qwen3-32B 这样具备 320亿参数、支持128K上下文长度的开源强模型&#xff0c;正成为构建智能问答、代码…

作者头像 李华
网站建设 2026/5/26 6:18:33

Qwen3 + NPU 仿真实战 二. MAC 单元设计

Qwen3 NPU 仿真实战 第二节&#xff1a;单个 MAC 单元设计&#xff08;1616 阵列&#xff0c;支持 INT8/BF16&#xff09;1. MAC 单元在 LLM 推理中的作用 Qwen3 推理的主要计算量来自矩阵乘法&#xff08;MatMul/Linear&#xff09;&#xff0c;涵盖 QKV 投影、Attention Sco…

作者头像 李华
网站建设 2026/5/25 23:59:22

vivo Celeborn PB级Shuffle优化处理实践

一、背景近年来&#xff0c;随着vivo大数据平台的数据量和任务量持续快速增长&#xff0c;新增的计算机资源已无法满足不断扩大的存储和计算需求。同时&#xff0c;我们观察到互联网和算法等在线业务在白天流量高峰&#xff0c;而在夜间流量显著下降&#xff0c;导致部分服务器…

作者头像 李华
网站建设 2026/5/26 1:32:01

33、拼写检查:从Unix原型到awk实现

拼写检查:从Unix原型到awk实现 1. 拼写检查概述 拼写检查是一个有趣且具有挑战性的问题,有超过300篇研究论文和书籍都围绕它展开。在处理文本时,拼写检查能帮助我们发现并纠正错误,提高文本质量。下面我们将从不同角度探讨拼写检查的实现方式。 2. 原始Unix拼写检查原型…

作者头像 李华
网站建设 2026/5/26 2:28:30

38、Shell 可移植性问题与扩展

Shell 可移植性问题与扩展 1. 概述 POSIX 定义的 shell 语言比原始的 V7 Bourne shell 大得多,但比 ksh93 和 bash 这两种最常用的 Bourne shell 扩展版本所实现的语言小得多。如果你要进行利用 shell 语言扩展的重型脚本编写,很可能会使用这两种 shell 中的一种或两种。因…

作者头像 李华