2012-02-24 190 views
0

我想了解從一個簡單的優先級隊列這個C代碼,尤其是 - 爲什麼它需要struct qnode **first部分:爲什麼這個C函數將一個指針指針作爲參數?

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

由於C沒有傳遞按引用傳遞只按值,這種做法是讓這項任務的唯一方法:

*first = (*first)->next; 
對呼叫者可見的

(如果first只是一個指針,而我們寫first = first->next,然後調用此函數不會看到修改的代碼。)

+0

C *具有*傳遞引用,您可以使用指針實現它。 「傳遞引用」是一個概念,而不是特定的編程語言結構。相比之下,C++還允許通過指針或通過本機引用類型傳遞引用。另一方面,Java [沒有任何參考依據](http://javadude.com/articles/passbyvalue.htm)。 – 2012-02-25 00:00:58

+1

@KerrekSB:我不同意;傳遞值和傳遞引用是語言語義的問題。 C和Java都具有僅通過按值,儘管都提供機制,以模仿傳按引用語義(在C中,可以通過一個指針;在Java中,可以通過一個可變的包裝對象)。 – ruakh 2012-02-25 00:05:42

+0

@KerrekSB:順便說一句,您鏈接的頁面與我同意;它說,例如,「Java嚴格按照價值傳遞,完全如同C」。 – ruakh 2012-02-25 00:07:01

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! 
} 
+0

非常感謝你!這是點擊! – Coffee 2012-02-25 03:49:11

相關問題