我正在编写一些C代码来实现像push,pop等基本的栈数据结构操作。 我使用堆栈的链表实现。 在这个实现中,每次我将一个值推入卡住时,我创建一个新节点,并将其设置为我的链接列表的头节点。所以这涉及到改变头节点的引用。为什么我们在C中传递Structure参数时使用双指针?
void push(stack **t, int ele)
{
stack *new, *temp;
temp=*t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=*t;
*t=new;
}
如果我是写使用单个指针类似的代码,那么它会是这样
void push(stack *t, int ele)
{
stack *new, *temp;
temp=t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=t;
t=new;
}
在功能方面,头节点(**吨)出现在赋值的RHS在所有步骤中,但这
*t=new;
基本上所述第一代码分配“新”到的**吨的指针,也就是* T,和第二代码受让人“新”到的* T的指针,也就是吨。 两者似乎都只需要指向头节点的单指针指定为“新”,但只有第一个代码有效,而第二个实际上并不修改头节点值。
这是怎么发生的?为什么第二个代码的工作方式与第一个类似?
您需要修改指向传递给'push()'的第一个堆栈元素的指针,因此您需要一个指向指针类型的指针参数。在第二个函数中,赋值给't'在函数外部是不可见的。 – 2013-03-27 18:52:56
在第二个代码中,函数是否简单地将指针复制到堆栈,并且该函数执行的所有更改仅应用于副本? – 2013-03-27 18:57:22
请注意,请不要使用名为'new'(或'this'或'delete')的变量。你可能会认为你永远不会将你的代码转换成C++,但是如果发生这种情况,你现在可以通过避免使用C++的关键字来让事情变得更容易。 – mah 2013-03-27 18:57:37