当我写 Func1(int &a) 和 Func1(int *a) 时有啥区别 [重复]
Posted
技术标签:
【中文标题】当我写 Func1(int &a) 和 Func1(int *a) 时有啥区别 [重复]【英文标题】:What is the Difference When i write Func1(int &a) and Func1(int *a) [duplicate]当我写 Func1(int &a) 和 Func1(int *a) 时有什么区别 [重复] 【发布时间】:2011-05-13 15:45:15 【问题描述】:可能重复: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 而它却期待 a 的地址
【问题讨论】:
你的书怎么说? @casablanca:这真的是那个链接的副本吗?这里的重点是按值传递和按引用传递? @Chubsdad:OP 询问了int &a
和int *a
之间的区别——引用和指针。
【参考方案1】:
当为传递引用参数提供参数时,编译器将在后台执行必要的 & 操作。作为程序员,您知道它在内部使用参数的地址,但这隐藏在传递引用抽象中。这比使用指针更安全,因为您不会无意中重新分配引用。
【讨论】:
另外,您可以省去检查nullptr
的麻烦。【参考方案2】:
基本上当你有一个 &something 你有一个引用,这只不过是一个不能改变的指针,换句话说就是一个 const 指针,所以基本上它就像 *something 但在这种情况下你可以改变指针(指向其他地方) :)
一个简单的例子:
参考:Object &obj
同样用指针写法:Object* const obj
【讨论】:
【参考方案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
【讨论】:
a = &b
仅更改函数的本地 a
。一旦离开函数,您将需要一个指向指针的指针来更改它。
这不是重点。之后你可以再做一个*a = 5
,这会修改一个不同的地址。参考是不可能的。【参考方案4】:
Func1 将采用对 int 的引用,Func2 将采用指向 int 的指针。当您执行 Func2(&someint) 时,您正在为函数提供 someint 的地址。可以取消引用此地址以获取其值。当您“按值传递”Func1(int someint) 时,会执行 someint 的副本。当您通过引用或指针传递时,不会执行此类复制。
引用可以被认为是原始值的“别名”,或者是引用它的另一种方式。是的,它是抽象的,但是,其他一切都是特定于实现的,您不必担心。
希望对您有所帮助。
【讨论】:
【参考方案5】: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
【讨论】:
【参考方案6】:不是这样的,
Func1(int &a)
- 当您调用此函数 Func1(a)
时,它将仅在此处传递 int,该函数接收传递参数的地址。
Func2(int *a)
- 当你用Func2(&a)
调用这个函数时,这个语句只是传递了'a
'的引用。在被调用函数的参数“*a
”中,它将获得引用该调用函数的参数“&a
”的值。
【讨论】:
【参考方案7】:在Func1(int &a)
中,&a
是对您将要传递的变量的引用。
在Func2(int *a)
中,*a
是指向您将通过其地址传递的变量地址的指针。
【讨论】:
什么? Func1(int &a) 是函数声明。您正在声明一个将引用 int 的函数。当调用 Func1 时,你不会说 int &a,你会说 &a,在这种情况下,是的,你会得到 int 的地址(这对于上面的声明是无效的,因为函数引用了一个 int ,而不是 intptr)。不敢相信这居然得到了两个赞成票。 @John 我从来没有说过要用 &a 调用 with 函数,我是在函数声明或定义中说明 &a 的含义。 除了,在函数声明中, int &a 表示您将传入一个对函数的引用。 &a 仅在函数声明之外使用时表示“a 的地址”。【参考方案8】:当函数定义为 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.
【讨论】:
以上是关于当我写 Func1(int &a) 和 Func1(int *a) 时有啥区别 [重复]的主要内容,如果未能解决你的问题,请参考以下文章