Хитрый С-код для функции очереди, что происходит с указателями? - PullRequest
0 голосов
/ 01 февраля 2012

Я пытаюсь понять этот код C для изменения очередей:

  /*
    * create or delete a queue
    * PARAMETERS: QUEUE **qptr - space for, or pointer to, queue
    * int flag -  1 for create, 0 for delete
    * int size - max elements in queue
    */
    void qManage(QUEUE **qptr, int flag, int size){
         if(flag){
                  /* allocate a new queue */
                  *qptr = malloc(sizeof(QUEUE));
                  (*qptr)->head = (*qptr)->count = 0;
                  (*qptr)->que = malloc(size * sizeof(int));
                  (*qptr)->size = size;
                  }
                  else{
                       // delete the current queue
                       (void) free((*qptr)->que);
                       (void) free(*qptr);
                 }
           }

Что такое параметр **qptr?Что означает (*qptr)->head?Я знаю, что -> это указатель на ссылку на элемент структуры, но я заблудился в том, что здесь происходит.Я ценю любые советы или рекомендации.

1 Ответ

5 голосов
/ 01 февраля 2012

QUEUE** qptr означает, что qptr - это указатель на указатель на QUEUE (что бы это ни было).

*qptr - это «память, на которую указывает qptr», чтоТаким образом, указатель на QUEUE.

x->y совпадает с (*x).y.Другими словами, «возьмите вещь, на которую указывает x, затем получите ее y».См. https://stackoverflow.com/a/3479169/383402 для справки.

Итак, (*qptr)->head - это head из QUEUE, на который указывает вещь , на которую указывает qptr.

Дополнительный уровень косвенности таков, что функция может эффективно возвращать QUEUE*.Чтобы вернуть QUEUE*, он принимает QUEUE** и указывает на вновь выделенную память.

...