news 2026/7/7 18:01:07

为什么 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/7/6 19:14:27

使用Qwen3-14B进行法律文书辅助撰写的合规性探讨

使用Qwen3-14B进行法律文书辅助撰写的合规性探讨 在律师事务所的某个深夜&#xff0c;一位年轻律师正为第二天开庭的案件赶制答辩状。他反复核对《民法典》条文、比对类似判例、调整措辞逻辑——这本是再普通不过的一幕&#xff0c;但如今&#xff0c;这样的场景正悄然发生变化…

作者头像 李华
网站建设 2026/7/7 8:24:20

2025 网安副业入门:5 个低门槛方向,零基础也能接的第一单

2025 网安副业入门&#xff1a;5 个低门槛方向&#xff0c;零基础也能接的第一单 “学了半个月 Kali&#xff0c;想赚点外快却不知道从哪下手”“怕技术不够接不了单&#xff0c;又怕定价太高没人要”—— 这是 90% 网安新手想做副业时的共同困境。2025 年网安副业市场需求旺盛…

作者头像 李华
网站建设 2026/7/7 10:03:04

WebSocket实时通讯完整指南:从基础到生产级应用

引言在现代Web应用开发中&#xff0c;实时通讯已经成为不可或缺的功能。无论是聊天应用、实时数据监控&#xff0c;还是在线游戏&#xff0c;WebSocket都扮演着重要角色。本文将基于Vue3项目&#xff0c;详细介绍如何实现一个生产级的WebSocket实时通讯方案。一、WebSocket基础…

作者头像 李华
网站建设 2026/7/7 9:48:48

43、Unix 手册页与文件系统全面解析

Unix 手册页与文件系统全面解析 1. 手册页语法检查 在 Unix 系统中,检查手册页的正确格式通常有多种方式。可以通过打印输出来直观检查,使用的命令如下: - groff -man -Tps pathfind.man | lp - troff -man -Tpost pathfind.man | /usr/lib/lp/postscript/dpost | lp…

作者头像 李华
网站建设 2026/7/7 13:01:52

大模型+数据治理=解放双手!AI Agent编程实战,让代码自己会思考

引言 当“人治”成为数据治理的最大瓶颈&#xff0c; AI Agent 正在成为那根撬动变革的杠杆。 在企业数字化浪潮中&#xff0c;“数据治理”早已不是新鲜词。但现实却令人无奈&#xff1a;制度写得再完善&#xff0c;执行仍靠人&#xff1b;流程设计再精细&#xff0c;落地总…

作者头像 李华
网站建设 2026/7/7 13:52:03

AI干货:多模态大模型技术演进全解析!从CLIP到Qwen3-Omni,三条技术路线重塑AI开发范式,小白也能看懂的AI革命!

导语 从视觉与语言的初步对齐&#xff0c;到跨模态理解与生成的深度融合&#xff0c;多模态大语言模型&#xff08;Multimodal LLM&#xff09;的演进正以前所未有的速度重塑人机交互的边界。 回溯这一技术脉络&#xff0c;CLIP 首次通过对比学习在海量图文数据中建立起语义对…

作者头像 李华