可能重复:
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答案 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)
不是那样,
Func1(int &a)
- 当你调用这个只传递int的函数Func1(a)
时,函数会收到传递参数的地址。
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.