[英]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
中, &root
是foo
中形式參數root
的地址,但在bar
中,您是從main
傳遞變量的地址。 換句話說, foo
中的值發生了更改,但是當foo
返回時,該更改丟失了,因為它沒有更新main
中的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.