C ++函数参数将指针的地址作为参数。这是怎么用的?它是为了什么?

时间:2012-12-20 21:08:51

标签: c++ function pointers reference

想象一下这样的函数:

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

你能解释一下究竟是什么?&是什么?它将用于什么?与传递指针或引用有什么不同?你能给出一个小的解释性样本吗?

谢谢。

5 个答案:

答案 0 :(得分:7)

void doSomething(int &*hi);

不起作用。你不能指向参考。但是,这个:

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

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

如果查看此代码,则将“hi”指向“someVar”。但是,对于传递给此函数的原始指针,没有任何内容会发生变化,因为指针本身正在按值传递。

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

所以你这样做,

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

这样传入函数的原始指针也会改变。

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

“获取指针的地址” - 不,它没有。 应该将reference带到指针。

但是,这是语法错误。您可能想要的是

rettype function(Human *&human)

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

答案 3 :(得分: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的对象的值。

答案 4 :(得分:4)

即使它看起来像地址运算符,但它不是 - 它是一个参考参数。如果希望能够在呼叫者端更改值,可以使用引用。在这种情况下,指针可能正在函数中设置或更改。