2010-05-23 118 views

回答

1

這被稱爲雙重間接,意思是你有一個指向另一個指針的指針,而指針又指向一些有用的數據(或者在極少數情況下指向另一個指針)。

Wikipedia有一篇很好的文章,涵蓋了一般指針,並且在雙重間接方面有很好的一節。

7

每當你需要一個指針指針:)。例如,如果要動態分配指針數組,operator new或malloc將返回指向數組中第一個指針的指針。

其他用途可能會將指針傳遞給函數,所以函數可以修改原始指針。在C++中,您可以按引用傳遞,但不能在C中傳遞。

+0

然後,爲什麼你會想要分配一個新的操作符的數組? – avakar 2010-05-23 21:09:53

+2

@avakar:例如分配一個char *數組? – nico 2010-05-23 21:11:20

+3

@nico:在StackOverflow上我收到了使用chars矢量而不是使用'new'的建議。 – dreamlax 2010-05-23 21:12:45

5

當您有一個函數需要增加一個指向c字符串的指針時。這是需要的東西像遞歸下降解析器其中每個規則負責遞增東西...

+0

+1不能是指向字符串的指針,但可以是任何數據。 – 2010-05-23 21:13:32

+0

@Felix Kling:是的,它可以是任何數據;但字符串是我所需要的唯一的東西。 – 2010-05-23 21:25:19

+1

請注意,指向指針的指針僅適用於C語言,在C++中,您應該傳遞對該指針的引用。 (我真的,真的不想開始任何宗教戰爭,這是否比C的方式或多或少有意義,我想指出這一事實。) – sbi 2010-05-23 21:54:05

2

它通常用於輸出參數是指針,例如:

bool GetSomeObject(SomeObject** object) { 
    *object = new SomeObject(); 
    // ... initialize object or whatever ... 
} 

而你也這樣稱呼它因此:

SomeObject* object; 
if (GetSomeObject(&object)) { 
    // ... use object ... 
    delete object; 
} 

這是一種常見的圖案,其中所述被叫方分配和呼叫者釋放...

3

在此的一些變化:

void PutNewObjectHere(Class **dp) { 
*dp = new Class; 
} 

Class *p; 
PutNewObjectHere(&p); 
delete p; 

(注意,這是一個愚蠢的例子。它通常會返回新的指針。但是,這個概念在實踐中偶爾會出現)

+0

當函數返回一些錯誤/成功值,即init函數時,經常使用它。 '處理程序*處理程序; if(init(&handler)){...}'帶有'init init(Handler ** handler){if(!check_stuff())return 0; * handler = get_new_handler();返回1; } – dbemerlin 2010-05-23 21:17:59

+0

@dbemerlin:是的,確切的。但是由於它與指針的使用正交,所以我忽略了這個混亂因素:) – Stephen 2010-05-23 23:04:56

0

特別是我在數組的上下文中使用了這些類型的指針。例如在我的8086模擬器項目中,我有一個函數指針數組。因此,它結束了看起來像這樣:

instruction_functions[(int)opcode](); 

這也被稱爲跳轉表(八九不離十)和大量的優化目的的場所使用。

2

你想要一個C函數來改變作爲參數傳遞的指針,它是C,所以沒有傳遞引用。因此你將一個指針傳遞給指針。下面是改編自大衛漢森的C Interfaces and Implementations一個最喜歡的例子:

void Bit_free(struct Bit_T **set) { 
    assert(set && *set); 
    free(*set); 
    *set = NULL; 
} 

通過寫NULL到釋放的指針,可以防止它從晃來晃去。

相關問題