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
相关产品推荐
相关产品推荐

