2012-02-01 7 views
0

私はキューを変更するため、このCのコードを理解しようとしています:キュー機能のトリッキーな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

'QUEUE'型の' typedef'を探します。それは 'head'メンバを持つ' struct'になります... – sarnold

+0

@sarnold - クール、私はあなたが何を意味するか見て、はい、 'int head'構造体があります – Coffee

答えて

5

QUEUE** qptrは、QUEUE(それが何であれ)へのポインタへのポインタであることを意味します。

*qptrは、「qptrによって指し示されるメモリ」であるため、QUEUEへのポインタです。

x->y(*x).yと同じです。言い換えれば、「xが指し示すものを取ってからyを得る」。参考までにhttps://stackoverflow.com/a/3479169/383402を参照してください。

ので、(*qptr)->headqptrによって指される事によって指されるQUEUEheadです。

間接指定の余分なレイヤーは、関数が効果的にQUEUE*を返すようになっています。 QUEUE*を返すには、QUEUE**を取り込み、新しく割り当てられたメモリを指し示すようにします。

関連する問題