c - 指针地址和双指针地址有什么区别
问题描述
我有这个简单的node.c代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int x;
struct Node *next;
} Node;
void unshift(Node **root, int value)
{
Node *newNode = malloc(sizeof(Node));
newNode->x = value;
newNode->next = *root;
*root = newNode;
}
//doesn't work if address of pointer is passed to unshift()
void foo(Node *root)
{
if (root == NULL)
{
//pass address of pointer
unshift(&root, 4);
}
}
//works with double pointer passed to unshift()
void bar(Node **root)
{
if (*root == NULL)
{
//pass double pointer
unshift(root, 4);
}
}
int main()
{
Node *root = NULL;
//works
// bar(&root);
// printf("%p\n", root);
//does not work
foo(root);
printf("%p\n", root);
}
现在有一个函数insert(Node **root, int value)
,它使用指向根的双指针来更改它(新创建的节点本身将成为根)。所以很明显我可以通过Node **
任何一种方式传递类型->双指针,或者指针地址。我在 2 个单独的函数 ->foo(Node*)
和bar(Node**)
. 因此,在 foo 中,我传递了参数的地址,而在 bar 中,我只是传递了它的参数。
问题是,只有bar()
with double 指针才会真正改变主指针的根指针。foo()
即使传递正确的数据类型,该函数也不会。也就是说,在调用 with 之后foo()
,指针 root 是nil
(在声明中仍然是空指针),而在bar()
指针之后真的changed
. 那么为什么编译器会以不同的方式处理地址和指针,即使它们都传递相同的数据呢?为什么不foo()
也改变根指针?
解决方案
它不是“相同的数据”。in foo
,&root
是 in 中形式参数的地址root
,foo
但是 inbar
您传递的是 from 变量的地址main
。换句话说,该值已更改,foo
但该更改在返回时丢失,foo
因为它没有更新 中的值main
。
推荐阅读
- event-tracking - 使用 Adobe Launch 进行事件跟踪
- python - 如何从我的 github 存储库中的 docs 文件夹中获取数据?当我尝试部署应用程序时它没有显示目录
- python - 为什么最后一个打印语句不需要变量符号?
- mariadb - Galera Cluster - 失去连接后在集群外启动一个节点
- c# - 如何使用 MailKit 库在电子邮件上获取我的回复?
- r - 刻面后缺少带有 ggpubr 的括号
- pytest - 气流 - Pytest - 找不到夹具'dag'
- javascript - 从数组中返回对象数组
- javascript - 使用 Java 脚本将新行添加到 HTML 表中时如何增加列
- javascript - 在 webdriverIO 中调用基本函数时出错