带有*&的c ++技巧这是什么意思?

时间:2012-11-30 04:25:32

标签: c++

  

可能重复:
  Difference between pointer to a reference and reference to a pointer

我是C ++的新手,我从事一个非常复杂的项目。当我试图找出一些东西时,我看到了一件有趣的事情:

n->insertmeSort((Node *&)first);

当我们深入了解insertmeSort时,我们可以看到相同的内容:

    void Node::insertme(Node *&to)
{
   if(!to) {
      to=this;
      return;
   }
   insertme(value>to->value ? to->right : to->left);
}

所以我的问题的原因是:Node *& - 星号和&符号,为什么?

它看起来很棘手,对我来说很有趣。

3 个答案:

答案 0 :(得分:1)

它是指针的引用。像任何常规引用一样,但底层类型是指针。

在引用之前,必须使用双指针完成引用指针(而且一些C-minded的人仍然会这样做,我偶尔会成为其中之一)。

为了避免有任何疑问,请尝试将其真正放入:

#include <iostream>
#include <cstdlib>

void foo (int *& p)
{
    std::cout << "&p: " << &p << std::endl;
}

int main(int argc, char *argv[])
{
    int *q = NULL;
    std::cout << "&q: " << &q << std::endl;
    foo(q);

    return EXIT_SUCCESS;
}

输出(您的值会有所不同,但&amp; p ==&amp; q)

&q: 0x7fff5fbff878
&p: 0x7fff5fbff878

很有希望p中的foo()确实是对q中指针main()的引用。

答案 1 :(得分:1)

这不是一个技巧,它只是类型 - “指向Node的指针”。

n->insertmeSort((Node *&)first);调用insertmeSort,其结果是将first投射到Node*&

void Node::insertme(Node *&to)声明insertme将对Node的指针作为参数的引用。

引用和指针如何工作的示例:

int main() {
    //Initialise `a` and `b` to 0
    int a{};
    int b{};
    int* pointer{&a}; //Initialise `pointer` with the address of (&) `a`
    int& reference{a};//Make `reference` be a reference to `a`
    int*& reference_to_pointer{pointer_x}; 

    //Now `a`, `*pointer`, `reference` and `*reference_to_pointer`
    //can all be used to manipulate `a`.
    //All these do the same thing (assign 10 to `a`):
    a = 10;
    *pointer = 10;
    reference = 10;
    *reference_to_pointer = 10;

    //`pointer` can be rebound to point to a different thing. This can
    //be done directly, or through `reference_to_pointer`.
    //These lines both do the same thing (make `pointer` point to `b`):
    pointer = &b;
    reference_to_pointer = &b;

    //Now `b`, `*pointer` and `*reference_to_pointer` can
    //all be used to manipulate `b`.
    //All these do the same thing (assign 20 to `b`):
    b = 20;
    *pointer = 20;
    *reference_to_pointer = 20;
}

答案 2 :(得分:0)

*&安培;表示您通过引用传递指针。因此,在这种情况下,您通过引用此函数传递指向对象的指针。如果没有参考,这条线就没有效果了

if(!to) {
  to=this;
  return;

}