指针转换引用指针有什么用?

时间:2011-10-01 21:20:33

标签: c++ pointers dereference

这个问题是关于代码解释,而不是代码调试。我正在使用的代码有效。 我正在使用公共代码,我很想看看他们的“grow array”模板之一,看起来像这样:

  template <typename TYPE>
    TYPE *grow(TYPE *&array, int n, const char *name)
    {
      if (array == NULL) return create(array,n,name);

      bigint nbytes = ((bigint) sizeof(TYPE)) * n;
      array = (TYPE *) srealloc(array,nbytes,name);
      return array;
    }

并且函数 srealloc 如下所示:

void *Memory::srealloc(void *ptr, bigint nbytes, const char *name)
{
  if (nbytes == 0) {
    destroy(ptr);
    return NULL;
  }

  ptr = realloc(ptr,nbytes);
  if (ptr == NULL) {
error();
  }
  return ptr;
}

现在请忽略创建功能。我的主要问题是为什么它们在模板中指针转换和取消引用array?那有什么好处?如果他们根本没有*&怎么办?

谢谢!

2 个答案:

答案 0 :(得分:2)

*&

不是“指针取消引用”。它是指针的引用。这是必需的,所以grow函数可以改变指针,而不仅仅是指针指向的指针。替代方案可能是指向指针的指针,如下面的代码所示。

template <typename TYPE>
TYPE *grow(TYPE **array, int n, const char *name)
{
  if ((*array) == NULL) return create((*array),n,name);

  bigint nbytes = ((bigint) sizeof(TYPE)) * n;
  (*array) = (TYPE *) srealloc((*array),nbytes,name);
  return *array;
}

答案 1 :(得分:2)

&令牌有很多含义,其中两个你在这里感到困惑。你不是一个人!作为操作员,它意味着“地址”,您似乎很满意(这来自C)。但作为一个类型限定符,它意味着“引用”,这是完全不同的。第一个含义:

int x ;
int* p = &x ; // p = address of x (as in C)

第二个含义:

void f (int& x) { // x is a reference to an int -- its address is passed to f
  x++ ;
}
...
int y = 99 ;
f (y) ; // After this call, y is equal to 100

在此示例中,代码等同于

void f (int* x) {
  (*x)++ ;
}
...
int y = 99 ;
f (&y) ; // After this call, y is equal to 100

这段代码看起来并不干净,但C程序员更容易理解。

所以......函数声明

void f (int*& p) ;

(如在您的示例中)表示f可以更改调用函数传递的int*参数的值。您的示例代码看起来有点棘手,因为如果可以直接更改参数,为什么需要返回array的新值?但这是一个风格问题,我已经学会了不要在这里讨论这些问题: - )