Поскольку сама очередь обрабатывается с помощью указателей (на 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!
}