当我写Func1(int& a)和Func1(int * a)时有什么区别

时间:2010-11-22 05:34:03

标签: c++ windows pass-by-reference parameter-passing

  

可能重复:
  Difference between pointer variable and reference variable in C++

当我开始使用C ++时,我发现下面的操作令人困惑。我知道通过引用传递和传递值。但是最近我遇到了这样的功能让我很困惑:

Func1(int &a) 
Func2(int *a)

这两个函数都需要a的地址,但是当我调用Func1时,我会按Func1(a)执行此操作,而对于Func2,我会调用Func2(&a)

为什么Func1在期待

的地址时直接接受int a

8 个答案:

答案 0 :(得分:6)

为pass-by-reference参数提供参数时,编译器将执行必要的&幕后操作。作为程序员,您知道它在内部使用您的参数的地址,但这隐藏在传递引用抽象中。这比使用指针更安全,因为您无法无意中重新分配引用。

答案 1 :(得分:6)

Func1(int &a) 
// accepts arguments by reference.
// changes to a inside Func1 is reflected in the caller
// a cannot bind to an Rvalue e.g. can't call Func1(5)
// a can never be referring to something that is not a valid object

Func2(int *a)
// accept arguments by value
// change to a inside Func1 not reflected in caller, changes to *a are
// a can bind to an Rvalue e.g. Func1(&localvar)
// a can be NULL. Hence Func2 may need to check if a is NULL

答案 2 :(得分:3)

基本上当你有一个& something你有一个引用时,这就是一个指针,它不会改变,换句话说就是一个const指针所以基本上就像它的东西,但在这种情况下,你可以改变指针(指向在其他地方):))

一个简单的例子:

参考:Object &obj

用指针语法写的相同:Object* const obj

答案 3 :(得分:3)

在内部,没有太大区别。但一个是参考,另一个是指针。主要区别在于您无法修改函数中的引用,因此引用始终指向a

void func1(int &a) {
    a = 5;
}

这将修改a,即调用者指向的任何变量。

void func2(int *a) {
    *a = 5;   // Same effect as the above code
    a = &b;   // You couldn't do that with a reference
}

答案 4 :(得分:1)

Func1将引用一个int,Func2将获取一个指向int的指针。当您执行Func2(& someint)时,您将为该函数提供someint的地址。可以取消引用此地址以获取其值。当你“通过值传递”Func1(int someint)时,会执行someint的副本。当您通过引用或指针传递时,不会执行此类复制。

可以认为引用基本上是原始值的“别名”,或者引用它的另一种方式。是的,它是抽象的,但是,其他一切都是特定于实现的,而不是你担心。

希望有所帮助。

答案 5 :(得分:0)

不是那样,

  1. Func1(int &a) - 当你调用这个只传递int的函数Func1(a)时,函数会收到传递参数的地址。

  2. Func2(int *a) - 当您使用Func2(&a)调用此函数时,此语句只传递“a”的引用。在被调用的函数参数“*a”中,它将获得引用调用函数的参数“&a”的值。

答案 6 :(得分:0)

Func1(int &a)中,&a是对您将要传递的变量的引用。

Func2(int *a)中,*a是指向您将通过其地址传递的变量的地址的指针。

答案 7 :(得分:0)

当函数定义为Func1(int& a)时,表示该函数将接受将作为参数传递给该函数的变量的地址。 (所以你不需要处理将参数传递给变量的变量的地址)。函数默认行为是获取传递变量的地址。

例如

 Func1(int &a){
   a = 5; //a will store 5 at &a
}
Func1(a) // don't need to pass &a, function definition will take care this.

=============================================== ====================

如果函数定义是Func2(int * a),则意味着它将保存给定值的地址。这意味着您必须将& a函数调用作为参数传递,稍后将其存储为函数定义中的* a。

例如

Fun2(int *a){
   *a = 7; //a will store 7 at &a
}

function call: Fun2(&a); Must have to pass &a, function definition will NOT take care this.
相关问题