【问题标题】:C++ function parameter takes an address of a pointer as an argument. How is this used? What is it for?C++ 函数参数将指针的地址作为参数。这是如何使用的?它是干什么用的?
【发布时间】:2012-12-20 21:08:50
【问题描述】:

想象一个这样的函数:

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

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

谢谢。

【问题讨论】:

  • 你应该看到引用的类型是“对Human*的引用”,而不是“*&Human”,然后一切都变得清晰了:它是一个指针类型(指针本身,而不是存储在它后面的内容)可以通过引用进行修改。就像引用的类型是一个“黑匣子”一样,就像您使用 typedef 或类似的东西一样。

标签: c++ function pointers reference


【解决方案1】:
void doSomething(int &*hi);

不会工作。您不能指向参考。但是,这个:

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

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

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

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

所以你这样做,

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

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

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

【讨论】:

  • 它不是对指针的引用。它是一个指向引用的指针,它是无效的。编辑:问题现在已解决,但您的答案不是。
【解决方案2】:

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

例如,'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;
}

【讨论】:

    【解决方案3】:

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

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

    rettype function(Human *&human)
    

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

    【讨论】:

    • 他们可能也想要一个返回类型。
    【解决方案4】:

    既然你是在脑海中写下这段代码,我会假设你打算做这样的事情:

    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

    【讨论】:

    • 谢谢。所以如果我将一个指针传递给一个函数,我不能改变它指向的东西吗?但我可以改变它指向的值吗?但现在我也可以更改它指向的内容。谢谢,我想我明白了。
    • 你可以改变它指向的东西(指向 ann 而不是 jeff)和它指向的东西的数据: void function(Human*& human) { human->SetAge(35); }
    • @KorayTugay 使用此语法,您可以更改指针指向的内容以及它指向的对象的值。只需执行void f(int *) {..} 将限制我们能够更改它指向的对象的值,而不是指针指向的对象。您需要更清楚的解释吗?
    • @David:如果我有“void function(Human *human)”并在方法内部执行类似的操作:Human *newHuman = new Human(); newHuman->someProperty = "somevalue";人类=新人类; // 我没有改变指针指向的地方吗?
    • @KorayTugay 不:在这种情况下,参数充当别名。传递给function 的指针根本不会改变。 human 指针充当局部变量,仅保存传递的指针参数的值。更改它根本不会影响指针。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多