繁体   English   中英

创建推入函数时,为什么要使用指向堆栈的指针?

[英]Why use a pointer to a pointer to the stack when creating a push function?

我正在看一个实现堆栈的链表的教科书示例。 我不明白为什么对于推送操作必须使用指向堆栈的指针。 请参见以下示例:

bool push( Element **stack, void *data)
{
    Element *elem = new Element;
    if(!elem) return false;

    elem->data = data;
    elem->next = *stack;
    *stack = elem;
    return true;
}

如果有人可以帮助阐明为什么push方法的第一个参数是指向指针的指针,我将不胜感激。 谢谢。

太神奇了,谢谢您的出色帮助。

该函数需要修改Element指针的值,因此它需要一个指向指针的指针。

换句话说,一个函数在需要修改某个东西时会使用它的指针。

在这种情况下,某物本身就是一个指针。 因此该函数最终将一个指针指向一个指针。

指针只是一个变量,它包含一个 ,该值是一个内存地址。

指向指针的指针也仅仅是保存值的变量。 该值是指针的内存地址。

要更改指针的值时 ,可以使用指向指针的指针。

//Not a very useful example, but shows what I mean...
void getOffsetBy3Pointer(const char *pInput, char **pOutput)
{
  *pOutput = pInput + 3;
}

您可以这样调用此函数:

const char *p = "hi you";
char *pYou;
getOffsetBy3Pointer(p, &pYou);
assert(!stricmp(pYou, "you"));

现在考虑如果尝试使用单个指针实现此功能会发生什么。

//Note: This is completely wrong
void BadGetOffsetBy3Pointer(const char *pInput, char *pOutput)
{
  //*pOutput refers to the first actual char element that pOutput points to.
  pOutput = pInput + 3;
  //pOutput now points to pInput + 3, but the variable we passed in remains distinct.
}

您可以这样调用此函数:

const char *p = "hi you";
char *pYou = NULL;
BadGetOffsetBy3Pointer(p, pYou);
assert(pYou == NULL);

请注意,在BadGetOffsetBy3Pointer中,我们可以更改某些字符,但不能更改pYou指向的字符。

堆栈基本上是指针的链接列表。 每个指向下面的一个。 因为您有一个新元素,并且希望该元素在列表中排在第一位(因此使用术语“堆栈”,所以您必须更改指向列表开头的位置)。

要更改“指向列表开头的指针”中的值,您需要该指针的地址。

由于这一行:

    *stack = elem;

基本上,您正在修改函数内部的原始指针。

您必须更新一个指针。

列表不过是指向Element的指针。 因此,您可以将其重写为

bool push(List* stack, void* data);

没看到,如果您不使用双指针,您的实际声明是

bool push(List stack, void* data);

这根本不会改变原始列表。

但是或者

bool push(Element* &stack, ...)

也可以,因为它允许您更新。

堆栈由指向被压入堆栈的最后一个元素的指针表示。 为了通过将元素压入堆栈来更改堆栈,必须更新此指针,因此我们将指向它的指针传递给push函数。

查看有人将如何使用此推功能:

Data d1, d2;

Stack *s = null; // s := null
push(&s, &d1); // s := {d1}->null
push(&s, &d2); // s:= {d2}->{d1}->null

现在,您可以继续使用变量s,该变量已通过按入指向不断增长的堆栈顶部的方式进行了修改。

在堆栈中,您总是要维护指向顶部的指针,而push函数使维护该指针更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM