【问题标题】:Trouble dereferencing double pointer麻烦取消引用双指针
【发布时间】:2012-01-04 10:10:07
【问题描述】:

我想使用链表实现堆栈。

为了为我的堆栈实现 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

标签: c pointers


【解决方案1】:

-> 的优先级高于取消引用运算符,所以这就像尝试取消引用 stack->value,因为 -> 先完成,* 第二完成。您需要使用括号:

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

或者,正如 wallyk 在 cmets 中建议的那样,取消引用参数以获取单个指针并使用它:

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

【讨论】:

  • 要么使用括号,要么显式使用中间值,struct Element *sip = *stack;*stack = sip->next;
【解决方案2】:

-> 在此行中的 operator precedence 高于取消引用 (*):

*stack->next

你是说:

*(stack->next)

因为stack->next 没有意义而失败。

你想要:

(*stack)->next

改为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多