当我写 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 &aint *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) 时有啥区别 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

装饰器&偏函数与作用域与异常处理与文件读写

数据结构-语法规则

Lambda表达式

指针减去数组和变量中的指针

“MyClass& func1(void)”和“MyClass* func2(void)”之间的区别 [重复]

装饰器