c ++中的奇怪类型

Cem*_*mre 8 c++ parameters types reference

我有一个原型的方法:

 bool getAssignment(const Query& query, Assignment *&result);
Run Code Online (Sandbox Code Playgroud)

我对第二个参数(Assignment *&result)的类型有点困惑,因为我认为我之前没有看过类似的东西.它用作:

 Assignment *a;
 if (!getAssignment(query, a))
    return false;
Run Code Online (Sandbox Code Playgroud)

它是对指针的引用还是反过来?还是两个?任何解释都表示赞赏.谢谢.

Kir*_*rov 18

它是指针的引用.我们的想法是能够改变指针.它就像任何其他类型.


详细说明和示例:

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

将不会更改p_main为指向已分配的char数组(这是一个明确的内存泄漏).这是因为你复制指针,它是通过值传递的(就像传递一个intby值一样;例如void f( int x )!= void f( int& x )).

所以,如果你改变f:

void f( char*& p )
Run Code Online (Sandbox Code Playgroud)

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


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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 12

对于这样的事情,你基本上从右到左(或从里到外)阅读声明.

换句话说,您希望从声明的项目的名称开始,然后向外进展.在这种情况下,直接从名称进展到类型,我们得到:

在此输入图像描述

  • 另外,如果您想要更详细的解释,[本网站](http://c-faq.com/decl/spiral.anderson.html)很好. (3认同)