双指针解引用问题

7

我想使用链表实现一个栈。

为了实现弹出操作(pop()),我让调用者通过传递一个双指针(指向指针的指针),最终指向我的栈顶元素(链表中的第一个元素)。

我这样做的原因是因为这样调用者可以保持一个静态指向栈的指针。

我的链表元素结构体如下:

struct Element {
int value;
struct Element *next;
};

pop()的实现:

int pop (struct Element **stack) {
    int popped_value = *stack->value;
    *stack = *stack->next;
    return popped_value;
}

我遇到的问题是尝试取消引用双指针**stack。此代码会生成以下错误:
error: request for member ‘value’ in something not a structure
error: request for member ‘next’ in something not a structure

在我的理解中,*stack->value和**stack.value都可以用来检索popped_value,但我会得到相同的错误。

只需使用好老的 stack-->next - Kapichu
2个回答

12

-> 的优先级高于解引用运算符,因此这就像尝试对 stack->value 进行解引用一样,因为 -> 先执行,* 然后执行。你需要使用括号:

int popped_value = (*stack)->value;
*stack = (*stack)->next;

或者,如wallyk在评论中建议的那样,对参数进行反引用以获得单个指针并使用它:

struct Element *sip = *stack;
int popped_value = sip->value;
*stack = sip->next;

1
要么使用括号,要么明确地使用中间值 struct Element *sip = *stack;*stack = sip->next; - wallyk

8

->在这行代码中比解引用(*)的优先级更高:运算符优先级

*stack->next

你说:
*(stack->next)

这会失败,因为stack->next没有意义。

你需要:

(*stack)->next

改为“代替”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接