为什么这个C函数将指针指针作为参数?

时间:2012-02-24 23:56:07

标签: c data-structures

我试图从简单的优先级队列中理解这个C代码,尤其是 - 为什么它需要struct qnode **first部分:

int quedel(struct qnode **first, struct qnode **last, int *prio, int *val) {
 struct qnode *tmp = NULL;

 if((NULL == *last) && (*last == *first)) {
  fprintf(stderr, "Empty queue.....\n");
  return -1;
 }

 *val = (*first)->data, *prio = (*first)->prio;
 tmp = *first, *first = (*first)->next;

 if(*last == tmp)
  *last = (*last)->next;
 free(tmp);

 return 0;
}

2 个答案:

答案 0 :(得分:2)

由于队列本身是通过指针(到struct qnode s)处理的,并且因为您希望quedel具有其firstlast元素的引用语义,所以使用通常的C语言来实现引用语义,方法是将指针传递给你想要引用的东西 - 而指向struct qnode的指针就是一个双指针。

quedel函数的要点是修改调用者范围内的实际变量,因为它删除了队列的头部并将调用者的原始头指针更改为指向新头部(或尾部)的新指针,或者以这种方式为止的方式):

{
    struct qnode * q = new_queue();  // or whatever

    add_lots_of_elements(q);         // fine; the head doesn't change,
                                     // only its contents do

    quedel(&q);                      // now q is something else!
}

答案 1 :(得分:2)

由于C没有pass-by-reference,只有pass-by-value,这种方法是进行此分配的唯一方法:

*first = (*first)->next;

来电者可以看到。

(如果first只是一个指针,我们写了first = first->next,那么调用此函数的代码将看不到修改。)