下面是一些将双指针传递给函数的代码。然后为双指针分配在函数中创建的指针的地址。当我打印出存储在双指针中的地址时,它会打印出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 = ¤tNode;
printf("\n¤tNode = %p", ¤tNode);
}
This is the result I get when I run the code
我知道如果将指针传递给函数,它将通过引用传递,这意味着当您访问函数外部的指针时,对函数中指针所做的任何更改都不会消失。
我的问题是,为什么我不能访问函数外的currentNode的地址。我把它分配给一个双指针,所以我应该可以在函数旁边访问它?正确?
以上已经回答
感谢您的答案保罗,它完美无缺。我试图扩展到代码。我想将nodePtr分配给名为 head 的结构指针。当我调用该函数时,我想将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 :(得分:0)
你的主要应该是:
int main()
{
struct node *nodePtr = NULL;
append( &nodePtr );
printf("\nnodePtr = %p", nodePtr);
return 0;
}
所以你从main传递了nodePtr的地址。
在附加中,您现在必须取消引用该指针:
// assigning the newly allocated currentNode to the double pointer NodePtr
*nodePtr = currentNode;
(所以不要设置局部变量currentNode
的地址,因为在函数返回后该局部变量将不复存在。你分配malloc
返回的指针。)
我建议您使用笔和纸来绘制main
和append
的内存,并绘制指针以查看正在发生的事情以及存储在哪里。
答案 1 :(得分:0)
如果你坚持使用双指针,你需要在函数中传递一个三重指针。
在您的代码中,更改是在函数内部执行的,但它们在终止后不会持续存在。
但是,您并不需要在main()
中使用双指针,只需使用单个指针,并保持该功能不变。