2012-12-20 50 views
4

想象一下这样的功能:C++函数参数将指针的地址作为参数。这是如何使用的?它是为了什么?

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

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

谢谢。

+1

您应该看到引用的类型为“以'人*'参考”,而不是“一个'*'来'Human'”,那么一切都变得清晰:这是一个指针类型的(指针本身,而不是存储在它后面)可以通过引用进行修改。就像引用的类型是一个“黑盒子”,就像你使用typedef或类似的东西那样。 – leemes

回答

5

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

例如“人”可以指向杰夫和功能可以修改它指向安。

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; 
} 
5

“需要一个指针的地址” - 不,事实并非如此。它需要应该采取reference一个指针。

然而,这是一个语法错误。你大概意思是

rettype function(Human *&human) 

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

+0

他们可能也想要一个返回类型。 – juanchopanza

+0

@ juanchopanza是的,当然,补充说。 – 2012-12-20 21:14:47

7
void doSomething(int &*hi); 

将无法​​正常工作。你不能指向引用。但是,这是:

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

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

如果你看看这个代码,它指向“嗨”到“someVar”。但是,对于传递给这个函数的原始指针,没有什么会改变,因为指针本身是按值传递的。

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

所以,你这样做,

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

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

如果你懂的“指针的指针”,那么试想一下,除了当事情是它可以像“非指针”来处理的参考。

+2

它不是对指针的引用。这是一个指向参考的指针,它是无效的。编辑:现在问题已经修复,但你的答案不是。 –

+0

我改变了我的问题。抱歉。 –

+0

@sftrabbit我也注意到了。我改变了我的答案。谢谢。 – Aaron

4

即使它看起来就像地址的运营商,它不是 - 这是一个基准参数。当您希望能够更改呼叫方的值时,请使用参考。在这种情况下,指针可能在函数中被设置或更改。

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对象的值。
+0

谢谢。所以如果我传递一个指向函数的指针,我不能改变它指向什么?但我可以改变它指向的价值?但现在我也可以改变它指向什么..谢谢我想我理解它。 –

+1

你可以改变它指向(指向安,而不是杰夫)和东西它指向的数据:void函数(人*人){人 - > SetAge(35); } –

+1

@KorayTugay使用此语法,您可以更改指针指向的内容以及它指向的对象的值。只是做'void f(int *){..}'将会把我们限制在只有**的地方,能够改变它指向的对象的值,而不是指针指向的对象。你需要更清楚的解释吗? – 0x499602D2

相关问题