2016-01-26 122 views
1

我有點困惑,我將如何去傳遞引用雙指針,我甚至不知道這是我正在尋找什麼。通過引用雙指針 - 混淆

基本上我遇到的問題是使用雙重排序的鏈接列表。我有一個函數,它接受一個指向我的歌曲節點的指針,按照他們的評分順序重新排列歌曲。如果評級收到零,則會通過此功能確保用戶提供介於1和5之間的有效評分,並將其重新插入到鏈接列表中。

的部分,我有點困惑是變化傳遞到第一個函數像這樣頭的初始值:

songNode* head = NULL; 
songNode* tail = NULL; 

displaySongs(head); 
printf("\n\n"); 
reassignSongs(head, tail); 

的reassignSongs函數需要一個指向這些歌曲節點..在reassignSongs函數中,它調用一個函數,該函數需要一個指向這些頭部和尾部變量的雙指針。

addSongToList(artist, title, rating, &head, &tail); 
int addSongToList(char* artist, char* title, int rating, songNode** head, songNode** tail) 

此函數操作頭指針,當我回到主函數頭變量仍是怎麼回事,因爲引用這個變量沒有改變..

我真的只是想知道這通常是如何處理的?你有沒有進入三分球?四重指針?拿一個指針的地址?

+0

你在尋找指針的指針嗎? '重新分配歌曲(&head,&tail);'帶有'void reassignSongs(songNode ** head,songNode ** tail)'的定義'' – AntonH

+0

這是我應該怎麼做的方式嗎?我唯一的問題是當我這樣做時,我該如何執行我的其他函數調用?我傳遞的是取消引用的雙指針的地址嗎?對我而言,這看起來很奇怪我不確定這是否是要走的路 –

+0

如果您想要交換指針頭部和尾部'通過函數,然後我會做一個函數,你傳遞指針的地址,使他們指向指針。[This SO question](http://stackoverflow.com/questions/897366/how-do -pointer-to-pointers-work-in-c)對如何使用它們有一個解釋 – AntonH

回答

1

reassignSongs函數的定義應該是這樣的:

void reassignSongs(songNode **head, songNode **tail),您的電話看起來像:

reassignSongs(&head, &tail);

這是使用的原因是更改地址存儲在任何headtail。要參考調用函數中頭部指向的songNode,您必須使用(*head)(*tail)來引用指向節點的指針,以便您可以在該函數內編輯列表的headtail

+0

因此,當我處於reassignSongs函數中時,我會調用另一個接收songNode **的函數。所以當將這些參數傳遞給THAT函數時,我必須傳入&* head? –

+0

@Kyle Jensen對不起,我遲到了,但是,只要你想改變指針的實際值,你會這樣做,但是,如果你正在嘗試改變**存儲**中的值,結構「,那麼你不需要函數來獲取'songNode **',而只需要'songNode *'。 –

+0

@Kyle Jensen如果你確實想要接收'songNode **'的函數,'head'的類型已經是'songNode **',那麼你在函數調用中只需要傳遞'head'。注意:'&* head'意思是指'head'指向的內容,然後''指代這個內存地址,所以'&* head'和'head'意思相同,所以在意識到你必須通過的是正確的。 –