簡體   English   中英

指針地址和雙指針地址有什么區別

[英]What is the difference between address of pointer and double pointer

我有這個簡單的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);
}

現在有一個 function insert(Node **root, int value) ,它采用指向根的雙指針來更改它(新創建的節點本身將成為根)。 所以很明顯,我可以通過任何一種方式傳遞類型Node ** -> 雙指針或指針地址。 我在 2 個單獨的 function -> foo(Node*)bar(Node**)中這樣做。 因此,在 foo 中,我傳遞了參數的地址,而在 bar 中,我只是傳遞了它的參數。

問題是,只有帶有雙指針的bar()實際上會從 main更改根指針。 foo() function 不會,即使傳遞了正確的數據類型。 也就是說,在使用foo()調用之后,指針根為nil (仍然是 null 指針,如聲明中的那樣),而在bar()之后,指針真的changed 那么為什么編譯器會以不同的方式處理地址和指針,即使它們都傳遞相同的數據呢? 為什么foo()也不改變根指針?

它不是“相同的數據”。 foo中, &rootfoo中形式參數root的地址,但在bar中,您是從main傳遞變量的地址。 換句話說, foo中的值發生了更改,但是當foo返回時,該更改丟失了,因為它沒有更新main中的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM