在最近的数据结构类任务中,我们希望使用这个“*&”在函数参数列表中。我无法找到有关为什么存在的信息,甚至是它的作用。使用它是标准做法吗?
这是一段代码片段
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;”你根本不能发送指针吗?
答案 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中,您将使用**
代替*&
来实现此目的,并且相应地将指针传递给指针。