5

想象一个这样的函数:

 function(Human *&human){
      // Implementation
 }

你能解释一下 *& 到底是什么吗?它会用来做什么?与仅传递指针或引用有何不同?你能提供一个小的解释性样本吗?

谢谢你。

4

5 回答 5

7
void doSomething(int &*hi);

不管用。您不能指向参考。然而,这:

void doSomething(int *&hi); // is valid.

它是对指针的引用。这很有用,因为您现在可以将此指针传递给函数以指向其他“人类”类型。

如果您查看此代码,它会将“hi”指向“someVar”。但是,对于传递给这个函数的原始指针,什么都不会改变,因为指针本身是按值传递的。

void doSomething(int *hi)
{
    hi = &someVar;
}

所以你这样做,

void doSomething(int *&hi)
{
    hi = &someVar;
}

这样传递给函数的原始指针也被改变了。

如果您理解“指向指针的指针”,那么请想象一下,除非某物是引用,否则它可以被视为“非指针”。

于 2012-12-20T21:11:07.553 回答
6

它就像一个双指针。您通过引用传递指针,允许“函数”函数修改指针的值。

例如,“human”可以指向 Jeff,函数可以修改它以指向 Ann。

Human ann("Ann");

void function(Human *& human)
{
    human = &ann;
}

int main()
{
    Human jeff("Jeff");
    Human* p = &jeff;
    function(p);  // p now points to ann
    return 0;
}
于 2012-12-20T21:11:06.610 回答
5

“获取指针的地址” - 不,它没有。它需要引用一个指针

但是,这是一个语法错误。你可能的意思是

rettype function(Human *&human)

(是的,它也缺少返回类型......)

于 2012-12-20T21:10:48.500 回答
5

由于您是在脑海中写下这段代码,所以我假设您打算做这样的事情:

void f(T *&) {}

此函数签名允许传递的指针变为可修改的,这是替代语法所不允许的int *。正如其他人在这里所说的那样,指针通过引用有效地传递。

使用这种语法,您现在可以修改实际指针,而不仅仅是它指向的指针。例如:

void f(int *& ptr) {
    ptr = new int;
}

int main() {
    int * x;
    f(ptr); // we are changing the pointer here

    delete x;
}

摘要(假设类型在参数中):

  1. T *: 我们只能改变指针指向的对象的值。更改参数不会更改传递的指针。
  2. T *&: 我们现在可以改变实际的指针T,以及它所指向的对象的值*T
于 2012-12-20T21:15:54.937 回答
4

尽管它看起来就像地址操作符,但它不是——它是一个引用参数。当您希望能够在调用者端更改值时,您可以使用引用。在这种情况下,指针可能正在函数内设置或更改。

于 2012-12-20T21:12:16.337 回答