2017-10-21 59 views
1

下面是一些將雙指針傳入函數的代碼。雙指針然後被分配在函數中創建的指針的地址。當我打印出存儲在雙指針中的地址時,它會打印NULL,這是我在將它傳遞給函數之前最初給出雙指針的值。將一個雙指針傳遞給一個函數,併爲它指定一個函數本地指針的地址

#include <stdio.h> 
#include <stdlib.h> 

struct node 
{ 
    int value; 
}; 

void append(struct node **nodePtr); 

int main() 
{ 
    struct node **nodePtr = NULL; 

    append(nodePtr); 
    printf("\nnodePtr = %p", nodePtr); 

    return 0; 
} 

void append(struct node **nodePtr) 
{ 
    // creating new node 
    struct node *currentNode = malloc(sizeof(struct node)); 

    // assigning the address of currentNode to the double pointer NodePtr 
    nodePtr = &currentNode; 

    printf("\n&currentNode = %p", &currentNode); 
} 

This is the result I get when I run the code

我知道,如果你傳遞一個指針到它通過引用傳遞的功能,這意味着您對在函數指針的任何變化,當你外部訪問指針不會消失功能。

我的問題是,爲什麼我不能訪問函數外的currentNode的地址。我把它分配給一個雙指針,所以我應該能夠訪問它的功能?對?

上面已經被回答

謝謝您的回答保羅,它的工作完美。我試圖擴展到代碼。我想將nodePtr分配給名爲頭部的結構指針。當我調用函數時,我想將currentNode中的地址存儲到頭指針中。

最初我以爲改變下面顯示的函數內部的代碼將工作。

*nodePtr = currentNode; 

但這不起作用,因爲我只是改變nodePtr中的內容而不是head中的內容。

然後我試着將nodePtr初始化爲head的地址。

struct node *nodePtr = &head; 

但這不起作用,因爲它不是一個雙指針。如果我將它初始化爲一個雙指針,我就遇到了我之前做過的同樣的問題。下面

是我的代碼到目前爲止

#include <stdio.h> 
#include <stdlib.h> 

struct node 
{ 
    int value; 
}; 

void append(struct node **nodePtr); 

int main() 
{ 
    struct node *head = NULL; 
    struct node *nodePtr = head; 

    append(&nodePtr); 

    printf("%p", head); 
    return 0; 
} 

void append(struct node **nodePtr) 
{ 
    // creating new node 
    struct node *currentNode = malloc(sizeof(struct node)); 

    // assigning the address of currentNode to the double pointer NodePtr 
    *nodePtr = currentNode; 
} 
+0

沒有「雙指針」這樣的東西。只有指針。指針可以指向任何東西,包括指針。指向指針的指針仍然只是指針,而不是「雙指針」。如果你牢記這一點,很多混亂應該消失。 – gnasher729

回答

0

你的主要應該是:

int main() 
{ 
    struct node *nodePtr = NULL; 

    append(&nodePtr); 
    printf("\nnodePtr = %p", nodePtr); 

    return 0; 
} 

所以,如果你主要通過NODEPTR的地址

在追加,則必須立即取消引用該指針:

// assigning the newly allocated currentNode to the double pointer NodePtr 
    *nodePtr = currentNode; 

(所以不要asssign局部變量currentNode的地址,因爲本地變量將停止在函數返回之後存在您分配。指針由malloc返回。)

我建議你使用筆和紙畫的mainappend內存和繪製指針,看看發生了什麼,什麼都存儲在哪裏。

0

如果你堅持使用雙指針,你需要在函數中傳遞一個三元指針。

在您的代碼中,更改是在函數內部執行的,但是它們在終止後不會保留。

但是,您並不需要在您的main()中使用雙指針,只需使用一個指針,然後按原樣保留函數。

相關問題