可能重複:
Uses for multiple levels of pointer dereferences?什麼情況下**會有用?
我用C here看到了有關**(指針的指針)的問題。我想知道這是什麼意思?我應該什麼時候使用它?
可能重複:
Uses for multiple levels of pointer dereferences?什麼情況下**會有用?
我用C here看到了有關**(指針的指針)的問題。我想知道這是什麼意思?我應該什麼時候使用它?
這被稱爲雙重間接,意思是你有一個指向另一個指針的指針,而指針又指向一些有用的數據(或者在極少數情況下指向另一個指針)。
在Wikipedia有一篇很好的文章,涵蓋了一般指針,並且在雙重間接方面有很好的一節。
每當你需要一個指針指針:)。例如,如果要動態分配指針數組,operator new或malloc將返回指向數組中第一個指針的指針。
其他用途可能會將指針傳遞給函數,所以函數可以修改原始指針。在C++中,您可以按引用傳遞,但不能在C中傳遞。
當您有一個函數需要增加一個指向c字符串的指針時。這是需要的東西像遞歸下降解析器其中每個規則負責遞增東西...
+1不能是指向字符串的指針,但可以是任何數據。 – 2010-05-23 21:13:32
@Felix Kling:是的,它可以是任何數據;但字符串是我所需要的唯一的東西。 – 2010-05-23 21:25:19
請注意,指向指針的指針僅適用於C語言,在C++中,您應該傳遞對該指針的引用。 (我真的,真的不想開始任何宗教戰爭,這是否比C的方式或多或少有意義,我想指出這一事實。) – sbi 2010-05-23 21:54:05
它通常用於輸出參數是指針,例如:
bool GetSomeObject(SomeObject** object) {
*object = new SomeObject();
// ... initialize object or whatever ...
}
而你也這樣稱呼它因此:
SomeObject* object;
if (GetSomeObject(&object)) {
// ... use object ...
delete object;
}
這是一種常見的圖案,其中所述被叫方分配和呼叫者釋放...
在此的一些變化:
void PutNewObjectHere(Class **dp) {
*dp = new Class;
}
Class *p;
PutNewObjectHere(&p);
delete p;
(注意,這是一個愚蠢的例子。它通常會返回新的指針。但是,這個概念在實踐中偶爾會出現)
特別是我在數組的上下文中使用了這些類型的指針。例如在我的8086模擬器項目中,我有一個函數指針數組。因此,它結束了看起來像這樣:
instruction_functions[(int)opcode]();
這也被稱爲跳轉表(八九不離十)和大量的優化目的的場所使用。
你想要一個C函數來改變作爲參數傳遞的指針,它是C,所以沒有傳遞引用。因此你將一個指針傳遞給指針。下面是改編自大衛漢森的C Interfaces and Implementations一個最喜歡的例子:
void Bit_free(struct Bit_T **set) {
assert(set && *set);
free(*set);
*set = NULL;
}
通過寫NULL
到釋放的指針,可以防止它從晃來晃去。
相關,也許不是一個重複的sort-ofishly:[用於多級指針取消引用?](http://stackoverflow.com/questions/758673/uses-for-multiple-levels-of-pointer-dereferences ) – 2010-05-23 21:11:18