You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言函数参数中的双星号**有什么作用

C语言链表头插函数参数中**的作用

你看到的node_t ** head是C语言里的二级指针,本质是「指向node_t类型指针的指针」,这里用它完全是为了解决C语言函数参数值传递的问题:

  • C语言所有函数传参都是值拷贝,如果你只传一级指针node_t* head进函数,函数内部操作的是外头那个头指针的副本,你在函数里改这个副本的指向,根本影响不到外面真正的链表头指针,函数跑完新申请的节点直接内存泄漏,链表头还是旧值。
  • 想要在函数内部修改外部指针变量本身的值,就必须把这个指针的地址传进函数,这时候参数类型自然就成了指向指针的指针,也就是二级指针**。

对应你贴的代码逻辑:

// 链表头插元素
void push(node_t ** head, int val) {
    node_t * new_node;
    new_node = (node_t *) malloc(sizeof(node_t));

    new_node->val = val;
    new_node->next = *head;
    *head = new_node;
}

调用这个函数的时候,你需要传入链表头指针的地址,比如push(&list_head, 5);,其中list_head本身是node_t*类型,取地址后刚好匹配node_t**的参数类型。
函数内部的*head是对二级指针解引用,直接拿到外部真实的头指针变量,不是拷贝副本:

  • new_node->next = *head:把新节点的后继指针指向原来的链表第一个节点
  • *head = new_node:把外部真实的头指针直接指向新创建的节点,头插操作才会真正对外部的链表生效。

补充:如果是C++环境可以用指针引用node_t*& head实现相同效果,不需要二级指针的写法,但纯C没有引用语法,修改外部指针就只能靠传二级指针的方式实现。

内容的提问来源于stack exchange,提问作者gigaSecure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:03:25