关于C++:当我写函数1(int &a)和函数1(int *a)时有什么不同?

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),如果使用func2,我会使用Func2(&a)调用。

为什么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

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


在内部,没有太大的区别。但一个是引用,另一个是指针。主要的区别是您不能在函数中修改引用,因此引用总是指向a

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

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

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
}


基本上,当你有一个引用,而这只是一个指针,它不能改变,换句话说,一个常量指针,所以基本上类似于*的东西,但在这种情况下,你可以改变指针(指向其他地方):。

一个简单的例子:

参考文献:Object &obj

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


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.


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

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


不是这样的,

  • Func1(int &a)—当您调用这个函数Func1(a)时,它只在那里传递int,函数接收传递参数的地址。

  • Func2(int *a)—当用Func2(&a)调用此函数时,此语句只传递'a的引用。在被调用函数参数"EDOCX1"〔9〕中,它将获得引用调用函数参数"EDOCX1"〔10〕的值。