我正在查看“Programming Interviews Exposed”一书中的以下段落,参考了 C 中链表堆栈的实现:
typedef struct Element {
struct Element *next;
void *data;
} Element;
void push( Element *stack, void *data );
void *pop( Element *stack );
现在考虑在适当的功能和错误处理方面在这些例程中会发生什么。这两个操作都会更改列表的第一个元素。必须修改调用例程的堆栈指针以反映此更改,但您对传递给这些函数的指针所做的任何更改都不会传播回调用例程。您可以通过让两个例程都获取指向堆栈指针的指针来解决此问题。这样,您可以更改调用例程的指针,使其继续指向列表的第一个元素。实施此更改会导致以下结果:
void push( Element **stack, void *data );
void *pop( Element **stack);
有人可以用不同的语言解释为什么我们需要在这里使用双指针吗?我对所提供的解释有点不确定。