gpt4 book ai didi

c++ - 指针转换取消引用的指针有什么用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:01 25 4
gpt4 key购买 nike

本题是代码讲解,不是代码调试。我正在使用的代码有效。我正在使用公共(public)代码,我很想看看他们的“增长数组”模板之一,它看起来像这样:

  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 ?这样做有什么好处?如果他们根本没有 *& 怎么办?

谢谢!

最佳答案

& 标记有很多含义,您在这里混淆了其中两个含义。你并不孤单!作为运算符,它的意思是“地址”,您似乎很熟悉(这来自 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 的新值?但这是风格问题,我已经学会了不要在这里讨论此类问题:-)

关于c++ - 指针转换取消引用的指针有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com