2011-05-27 191 views
1

mysql的代碼table.h。有在課本下面的代碼C中的雙指針問題(next爲單指針,prev爲雙指針)

typedef struct st_table_share 
{ 
    ... 
    struct st_table_share * next,  /* Link to unused shares */ 
     **prev; 

,我們usally有

sometype *next, *prev; 

,但在這裏使用**prev代替*prev。什麼原因使用雙指針prev

+0

也許如果你檢查它在代碼中的用處,你會看到爲什麼...... – jswolf19 2011-05-27 03:46:28

回答

5

它沒有指向前一個結構,因爲下一個結構指向指向這個結構的指針。

這樣做的好處是它可以指向前一個結構的'next'成員,或者它可以指向實際的頭部指針本身 - 在這是列表中的第一個項目的情況下。這意味着在這兩種情況下刪除該項目都會涉及「* prev = next」 - 沒有特殊情況更新頭指針。

缺點是你不能(容易地)使用它來向後遍歷結構;所以它的設計是爲了優化你只關心前向遍歷的情況,但卻想要輕鬆刪除任意節點。

+0

這對我來說真的很有幫助。但我還是不太明白:「這意味着在兩種情況下刪除項目都會涉及」* prev = next「 - 沒有更新頭指針的特殊情況」,定義*時有沒有不同於「prev = next」 prev(不是** prev)? – 2011-05-27 05:06:55

+0

如果prev被定義爲常規指針,那麼「prev = next」只會將_this_結構中的prev指針設置爲指向下一個結構 - 它不會改變任何有用的東西。但是當你從列表中刪除一個項目時,你想更新上一​​個結構中的'next'指針來跳過這個指針,指向下一個。使用普通的單指針,你可以使用「prev-> next = next」來做到這一點。指針可能會非常棘手以讓你頭腦發熱 - 對於這樣的情況,我建議繪製一些盒子圖並通過移除操作。 – BrendanMcK 2011-05-27 05:22:59

+0

感謝您的評論,下面的鏈接也有很好的解釋。只需分享它:http://www.codeproject.com/KB/trace/linkedlists.aspx – 2011-05-27 06:09:15

0

它不是你提到的「雙指針」。相反,它被稱爲「去參照」。

int x = 10; 
int* prev = &x; 

* prev是變量x的地址。

現在可以說你需要將指針變量prev的地址傳遞給另一個名爲foo的函數,它接受指針的地址作爲其參數(指向指針的指針)。

void function foo(int** ptr) 
{ 
    prinft("%p", ptr); //this would print the address of prev 

    printf("%p", *ptr); //this would print the value (the address of x) contained inside address contained inside ptr. 

    printf("%d", **ptr); //this would print the value (the value of x, 10) contained at the address(address of x) contained inside address (address of prev) contained inside ptr 
}