c ++ *&运营商的解除引用地址?

时间:2017-02-10 16:58:59

标签: c++ pointers

在最近的数据结构类任务中,我们希望使用这个“*&”在函数参数列表中。我无法找到有关为什么存在的信息,甚至是它的作用。使用它是标准做法吗?

这是一段代码片段

template <class T>
Thing <T> * action(const T &dataIn, Thing <T> *& thingIn)
{
    if(thingIn == NULL)
    {
        Node <T> *newThing = new Thing <T> (dataIn);

        newThing->ptr = thingIn;
        thingIn= newThing ;

        return(newThing );
    }
}

我想我的问题的另一部分是,为什么要使用“*&amp;”你根本不能发送指针吗?

5 个答案:

答案 0 :(得分:2)

它用于指向指针的引用类型

实施例

int *&ref = ptr;

在上面的例子中,ref是对int指针的引用ptr

然后可以传递给函数

function(int *&ref)

答案 1 :(得分:1)

fun(int x)

fun采用int值

fun(int * x)

fun按值

获取int指针

fun(int&amp; x)

fun通过引用获取int

fun(int *&amp; x)

fun通过引用获取一个int指针 - 调用者看到的x指针的值可以通过有趣的方式改变

答案 2 :(得分:0)

如果你有一个结构,例如

struct A
{
    //...
};

然后一个函数参数看起来像

void f( A * &pa );

在此声明中A *表示指针类型,&表示此指针通过引用传递给函数。

比较这两个代码段

void f( A * &pa )
{
    pa = new A();
}

//...


A *p = nullptr;

f( p );

在调用函数之后,变量p将具有函数中已分配内存的地址,因为它是通过引用传递给函数的。

如果函数将被声明为

void f( A * pa )
{
    pa = new A();
}

//...


A *p = nullptr;

f( p );

然后在调用函数后,指针p将不会被更改,因为该函数处理指针的副本。

答案 3 :(得分:0)

让我们看看这个:

void fun( int i );

我们按值传递参数,这意味着函数可以使用int i但不能更改用于传递该值的变量:

void fun( int i ) { i = 123; }

int main()
{
    int j = 0;
    fun( j ); 
    std::cout << j << std::endl; // j is still 0
}

另一方面,当我们使用引用时,变量将被更改:

void fun( int &i ) { i = 123; }

int main()
{
    int j = 0;
    fun( j ); 
    std::cout << j << std::endl; // j is 123 now
}

如果你理解这个概念,你应该能够找到更复杂的类型,只需使用typedef或更现代的using

 typedef char * pchar;
 fun( pchar &p );
 fun( char *&p ); // this is the same as before

你实际上可以在程序中使用它,或者至少在你的脑海中使用它,这应该简化你对指针与其他任何东西相同的变量的理解。它还有助于理解其他复杂类型,如指针指针等。

答案 4 :(得分:0)

  

在最近的数据结构类任务中,我们希望使用这个“*&amp;”在函数参数列表中。我无法找到有关为什么存在的信息,甚至是什么   确实

C ++声明可以从右向左阅读。它是指针的引用。

  

使用它是标准做法吗?

不是真的。见下文。

  

我想我的问题的另一部分是,为什么要使用“*&amp;”你根本不能发送指针吗?

引用允许您修改被引用的对象。

指针是一个对象。因此,对指针的引用允许您修改指针。修改指针意味着使其指向其他地方。因此,如果在函数中使用*&,则意味着该函数可以更改函数之外的指针所指向的位置。

更改原始指针的目标不是您在C ++中经常做的事情,但一如既往,它取决于您的应用程序域。

更改现有指针的目标当然感觉更像是C风格的编程,并且C中没有引用。在C中,您将使用**代替*&来实现此目的,并且相应地将指针传递给指针。