麻烦解除引用双指针

时间:2011-11-23 02:48:11

标签: c pointers

我想使用链表实现堆栈。

为了实现我的堆栈的pop(),我让调用者传递一个双指针(指向指针的指针),它最终指向我的堆栈顶部(链表中的第一个条目)。

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

我的链接列表元素struct:

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

pop()实现:

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

我遇到的问题是试图取消引用双指针**堆栈。此代码生成以下错误:

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,但是我得到了相同的错误。

2 个答案:

答案 0 :(得分:10)

->的优先级高于取消引用运算符,因此就像尝试取消引用stack->value一样,因为->首先完成,*完成第二次。你需要使用括号:

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

或者,正如wallyk在评论中所建议的,取消引用该参数以获得单个指针并使用它:

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

答案 1 :(得分:8)

->在此行中的解除引用次数operator precedence高于*

*stack->next

你在说:

*(stack->next)

由于stack->next没有意义,因此失败了。

你想:

(*stack)->next

代替。