设为首页 加入收藏

TOP

指针引用
2013-04-10 11:40:28 来源: 作者: 【 】 浏览:212
Tags:指针 引用

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

  }

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇七种排序算法的简单分析 下一篇如何定位c++内存泄露

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: