Почему эта функция C принимает указатель на указатель в качестве параметра? - PullRequest
0 голосов
/ 25 февраля 2012

Я пытаюсь понять этот 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 ]

2 голосов
/ 25 февраля 2012

Поскольку C не имеет передачи по ссылке, только передачу по значению, этот подход является единственным способом сделать это назначение:

*first = (*first)->next;

видимым для вызывающей стороны.

(Если бы first был просто одним указателем, а мы написали first = first->next, то код, вызывающий эту функцию, не увидел бы модификации.)

2 голосов
/ 25 февраля 2012

Поскольку сама очередь обрабатывается с помощью указателей (на struct qnode s), и поскольку вы хотите, чтобы quedel имел ссылочную семантику для ее элементов first и last, вы используете обычную 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!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...