在C語言中,如果想改變指針本身而不是這所指向的內容,函數聲明可能像這樣: [cpp] void f(int **); 當傳遞它時,必須取得指針的地址: [cpp] int i = 47; int *ip = &i; f(&ip); 當需要向一個buffer中不斷的增加內容,需要改變buffer的地址。比如說,要分析一個文件,將文件中所有以s開頭的單詞都加入到這個buffer中,然後我們在分析文件之前,並不清楚多大的buffer可以裝得下這些單詞,所以開始時只能malloc出一個固定大小的buffer(比如1M),當發現buffer不夠用時,再通過realloc增加buffer,這時buffer的地址可能改變。 我們用一個函數GetEnoughBuffer來增大既有buffer,如果不使用指針引用,則應該使用指針的指針,函數實現如下: [cpp] int GetEnoughBuffer_PointerPointer(char **ppBuffer, unsigned int bufferSize) { int newBufferSize = 0; if (strlen(*ppBuffer) + 128 > bufferSize) { newBufferSize = bufferSize + 1024; *ppBuffer = (char *) realloc((void *)*ppBuffer, newBufferSize); } if (NULL == *ppBuffer) return 0; return newBufferSize; } 代碼中多處用到*ppBuffer這樣形式來獲取buffer地址,閱讀起來實在是費勁。 如果使用指針引用,則函數 int GetEnoughBuffer_RefPointer(char *&pBuffer, unsigned int bufferSize) { int newBufferSize = 0; if (strlen(pBuffer) + 128 > bufferSize) { newBufferSize = bufferSize + 1024; pBuffer = (char *) realloc((void *)pBuffer, newBufferSize); } if (NULL == pBuffer) return 0; return newBufferSize; } 代碼邏輯不變,語法上卻清晰多了。函數參數變成指針的引用,用不著取得指針的地址: [cpp] int main() { char *pBuffer, *pBuffer1; int bufferSize = 32; pBuffer = (char *) calloc(bufferSize, 1); strcat(pBuffer, "strong"); pBuffer1 = (char *) calloc(bufferSize, 1); // buffer1 是用於限制buffer後的可擴展空間,在 strcat(pBuffer1, "stone"); // VS2005中buffer1將在buffer後面96字節處開辟出來 // bufferSize = GetEnoughBuffer_PointerPointer(&pBuffer, bufferSize); // bufferSize = GetEnoughBuffer_RefPointer(pBuffer, bufferSize); return 0; }