What is the Difference When i write Func1(int &a) and Func1(int *a)
Possible Duplicate:
Difference between pointer variable and reference variable in C++
当我从C++开始时,我发现下面的操作很混乱。我了解了通过引用传递和通过值传递。但最近我遇到了这样的功能,这让我困惑:
1 2 | Func1(int &a) Func2(int *a) |
这两个函数都期望a的地址,但是当我调用func1时,我会使用
为什么func1在等待a的地址时直接接受int a?
1 2 3 4 5 6 7 8 9 10 11 | 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 |
当为传递引用参数提供参数时,编译器将在后台执行必要的操作。作为程序员,您知道它在内部使用参数的地址,但这隐藏在传递引用抽象中。这比使用指针更安全,因为您不能无意中重新分配引用。
在内部,没有太大的区别。但一个是引用,另一个是指针。主要的区别是您不能在函数中修改引用,因此引用总是指向
即
1 2 3 | void func1(int &a) { a = 5; } |
这将修改
1 2 3 4 | void func2(int *a) { *a = 5; // Same effect as the above code a = &b; // You couldn't do that with a reference } |
基本上,当你有一个引用,而这只是一个指针,它不能改变,换句话说,一个常量指针,所以基本上类似于*的东西,但在这种情况下,你可以改变指针(指向其他地方):。
一个简单的例子:
参考文献:
用指针语法写的相同:
func1将引用一个int,func2将接受一个指向int的指针。当您执行func2(&someint)时,您将向函数提供someint的地址。可以取消引用此地址以获取其值。当您"传递值"func1(int somint)时,将执行somint的副本。当通过引用或指针传递时,不会执行此类复制。
一个引用可以被认为是原始值的"别名",或者是引用它的另一种方式。是的,它是抽象的,但是,其他的一切都是特定于实现的,您不必担心。
希望有帮助。
当函数定义为func1(int&a)时,意味着该函数将接受变量的地址,该地址将作为参数传递给该函数。(所以您不需要考虑传递变量的地址,该变量将作为函数的参数)。函数的默认行为是获取传递变量的地址。
例如
1 2 3 4 | 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存储。
例如
1 2 3 4 5 | 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. |
在
在
不是这样的,