程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 指針引用

指針引用

編輯:C++入門知識

在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;   }      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved