首页 > 解决方案 > 指针地址和双指针地址有什么区别

问题描述

我有这个简单的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()也改变根指针?

标签: cpointerslinked-list

解决方案


它不是“相同的数据”。in foo,&root是 in 中形式参数的地址rootfoo但是 inbar您传递的是 from 变量的地址main。换句话说,该值已更改,foo但该更改在返回时丢失,foo因为它没有更新 中的值main


推荐阅读