8

我有一个原型方法:

 bool getAssignment(const Query& query, Assignment *&result);

我对第二个参数 ( Assignment *&result) 的类型有点困惑,因为我认为我以前从未见过类似的东西。它的用法如下:

 Assignment *a;
 if (!getAssignment(query, a))
    return false;

它是对指针的引用还是相反?或者两者都不是?任何解释表示赞赏。谢谢。

4

2 回答 2

18

它是对指针的引用。这个想法是能够改变指针。它就像任何其他类型一样。


详细解释和示例:

void f( char* p )
{
    p = new char[ 100 ];
}
int main()
{
    char* p_main = NULL;
    f( p_main );
    return 0;
}

不会更改p_main为指向分配的 char 数组(这是明确的内存泄漏)。这是因为您复制了指针,它是按值传递的(就像int按值传递;例如void f( int x )!= void f( int& x ))。

所以,如果你改变f

void f( char*& p )

现在,这将通过p_main引用传递并改变它。因此,这不是内存泄漏,在执行 后fp_main将正确指向分配的内存。


PS 同样可以通过使用双指针来完成(例如,C没有引用):

void f( char** p )
{
    *p = new char[ 100 ];
}
int main()
{
    char* p_main = NULL;
    f( &p_main );

    return 0;
}
于 2012-07-07T15:07:12.883 回答
12

对于这样的事情,您基本上是从右到左(或由内而外)阅读声明。

换句话说,你想从被声明的项目的名称开始,然后向外推进。在这种情况下,直接从名称到类型,我们得到:

在此处输入图像描述

于 2012-07-07T15:18:46.933 回答