2012-08-27 28 views
1

我正在C中使用一個雙鏈表,並且遇到了一些我意識到我只是總是被接受爲事實或者一旦知道答案並且現在已經被遺忘的事情。當我開始再次使用指針時,這經常發生在我身上,最終我每次都不得不重新學習它們。爲什麼從構造中傳遞指針需要額外的解除引用?

這裏是我設置的基礎:

int main(void) 
{ 
    video *head = NULL; 
    video *tail = NULL; 

    char *buffer = NULL; 
    buffer = (char*)malloc(sizeof(MAX_TITLE_LENGTH)); 

    printf("Enter a title: "); 
    fgets(buffer, MAX_TITLE_LENGTH, stdin); 

    insert(buffer, &head, &tail); 
} 

我有一個結構:

typedef struct video 
{ 
    char title[MAX_TITLE_LENGTH]; 
    struct video *prev; 
    struct video *next; 
}video; 

原型進行插入:

int insert (char *title, video **head, video **tail); 

,我很奇怪,爲什麼我要專門傳遞視頻*的地址。

我知道我通過字符的方式,它傳遞字符串開始的內存中的地址。爲什麼我必須第二次去掉頭部和尾部才能訪問它們的值?

這實際上比我想的更簡單,我確信它,而且我的腦子處在一個不好的地方,思考指針。

任何人都可以把它鬆動?

謝謝。

回答

5

這是因爲該功能insert可能需要改變什麼headtail

請記住,在C中,函數參數是按值傳遞的。這就是爲什麼你要傳遞一個指向你想在函數中改變的struct的原因:提供一個指針允許你的函數訪問內存中的實際結構。

但是,指向struct的指針是按值傳遞的。如果你想改變指針指向怎麼辦?您需要額外的引用級別或實際上保存指針的內存,以便它不會被簡單地複製。通過額外的參考級別,您可以訪問指針以在函數中對其進行更改,並且可以使指針指向其他內容。

你會經常在鏈接列表代碼中看到這個,需要修改head元素:列表中的所有其他元素大概可以通過使用列表中每個節點中包含的指針來訪問,但是如果您需要例如在頭部插入一個新的元素,你的功能將需要改變的頭部指針。如果您將它作爲函數參數傳遞,則需要它的地址,否則函數只會更改副本,並且更改不會反映在函數外部。

+0

我現在明白了。感謝您花時間回答這樣一個很好的答案。我正在修改舊的雙鏈表代碼以保存其他內容,並且我忘記了這是如何工作的,因此您正在使用它,這正是它的原因! – Steve

相關問題