我有一个原型方法:
bool getAssignment(const Query& query, Assignment *&result);
我对第二个参数 ( Assignment *&result
) 的类型有点困惑,因为我认为我以前从未见过类似的东西。它的用法如下:
Assignment *a;
if (!getAssignment(query, a))
return false;
它是对指针的引用还是相反?或者两者都不是?任何解释表示赞赏。谢谢。
我有一个原型方法:
bool getAssignment(const Query& query, Assignment *&result);
我对第二个参数 ( Assignment *&result
) 的类型有点困惑,因为我认为我以前从未见过类似的东西。它的用法如下:
Assignment *a;
if (!getAssignment(query, a))
return false;
它是对指针的引用还是相反?或者两者都不是?任何解释表示赞赏。谢谢。
它是对指针的引用。这个想法是能够改变指针。它就像任何其他类型一样。
详细解释和示例:
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
引用传递并改变它。因此,这不是内存泄漏,在执行 后f
,p_main
将正确指向分配的内存。
PS 同样可以通过使用双指针来完成(例如,C
没有引用):
void f( char** p )
{
*p = new char[ 100 ];
}
int main()
{
char* p_main = NULL;
f( &p_main );
return 0;
}
对于这样的事情,您基本上是从右到左(或由内而外)阅读声明。
换句话说,你想从被声明的项目的名称开始,然后向外推进。在这种情况下,直接从名称到类型,我们得到: