这个问题是关于代码解释,而不是代码调试。我正在使用的代码有效。 我正在使用公共代码,我很想看看他们的“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
?那有什么好处?如果他们根本没有*&
怎么办?
谢谢!
答案 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
的新值?但这是一个风格问题,我已经学会了不要在这里讨论这些问题: - )