C++ c+中的奇怪类型+;

C++ c+中的奇怪类型+;,c++,types,reference,parameters,C++,Types,Reference,Parameters,我对原型有一个方法: 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
以指向已分配的字符数组(这是一个明确的内存泄漏)。这是因为您复制了指针,它是按值传递的(就像按值传递一个
int
;例如
void f(int x)
!=
void f(int&x)

因此,如果您更改
f

void f( char*& p )
现在,这将通过引用传递
p_main
,并将更改它。因此,这不是内存泄漏,在执行
f
之后,
p_main
将正确指向分配的内存


另外,也可以通过使用双指针(例如,
C
没有引用)来实现这一点:


对于类似的内容,您基本上是从右到左(或从内到外)阅读声明

换句话说,您希望从要声明的项的名称开始,然后向外进行。在本例中,直接从名称到类型,我们得到:


再加上一句,如果你想得到更详细的解释,这很好。@chris:我不太喜欢那种解释。他称之为顺时针螺旋法则,但“顺时针”与任何事情都无关。如果你决定逆时针走,它的工作原理也会完全相同。它充其量只是强调一些完全不相关的东西。没错,顺时针没有什么特别的意义,但你必须选择一些东西来记住它。我也听说过向左走。当我发现它的时候,我读过之后,从来没有遇到过理解任何东西的问题,所以它对我产生了很大的魔力,不管你选择哪种方式来记住它。无论如何都比按部分记忆好得多。顺时针方向,因为时钟从12点开始。只是为了提醒你,你拿第一个右手元素。吉米:第一个右边和元素在三点,在12到6的一半之间(嗯…现在有一个有趣的问题:“3点在12点到6点之间是什么时候?”),在……之前没有看到过这样的东西……C++,没有人真的这么做过。通常,它是作为C风格的双指针完成的。好吧,引用并不像其他类型。参考文献不是C++对象模型中的“对象”,指针和<代码> int >代码> s,其他类型都是,它们不能在初始化之后访问,因为没有语法来区分访问引用和访问引用对象,它们不遵循“声明MIMICS使用”语法,推导引用类型等有特殊规则。引用是特殊的。
void f( char** p )
{
    *p = new char[ 100 ];
}
int main()
{
    char* p_main = NULL;
    f( &p_main );

    return 0;
}