3

如果我有一个函数需要一个指向整数的指针,并且我从我的 main 传递一个对整数变量的引用,那么这个调用是按值调用还是按引用调用?示例代码:

#include <iostream>

using namespace std;

void fun(int *a){
//Code block
}

int main(){
    int a = 5;
    fun(&a);
    return 0;
}

在上面的代码中,函数fun的调用是值调用还是引用调用?

4

4 回答 4

5

您的调用是按值传递,但类型int*不是参数类型int。这意味着制作指针的副本并将其传递给函数。您可以更改它指向的值,但不能更改指针的值。

所以如果你的功能是这样的

void fun(int *a)
{
   *a = 10;
}

main像这样打电话

int main() {
    int b = 1;
    fun(&b);
    // now b = 10;
    return 0;
}

您可以b通过将指向它的指针传递给您的函数来修改值。

如果您执行以下操作会产生相同的效果 - 通过引用传递

void fun2(int& a) 
{
    a = 5;
}

int main()
{
    int b = 10;
    fun2(b); 

    // now b = 5;
    return 0;
}

现在考虑第三个函数,它按值接受整数参数

void fun3(int a)
{
    a = 10;
}

int main()
{
    int b = 1;
    fun3(b);
    // b  is still 1 now!
    return 0;   
}

使用按值传递,fun3更改传递给它的参数的副本,而不是bmain 范围内的变量。

通过(非常量)引用或指针传递允许修改传递给它的参数。通过值或 const 引用传递将不允许更改传递给它的参数。

于 2015-05-06T17:19:47.473 回答
1

您正在按值传递a 所在的地址。

因此,当您在名为 fun 的 void 中键入 *a 时,您正在访问 a 的值。

但正如我所说,您通过值传递一个指向 a 的 int 指针。

于 2015-05-06T17:11:09.333 回答
1

您正在按值传递指向的指针a

根据您所说的抽象级别,您可以说您因此是a通过指针传递,或者通过a“句柄”传递。从更广泛的意义上讲,“通过a引用传递”并不是严格不正确的,但在 C++ 中它是不正确的,因为“引用”在 C++ 中意味着特定的东西。此代码中没有 C++ 引用。

于 2015-05-06T17:16:39.063 回答
-1
It is call by reference as you are passing reference the address reference to your variable so, 
inside function
           *a = 100;
changes the value of a in caller function as the content at that address has been changed.
But address is passed by value so
             a = NULL;
will not change a, as a still be pointing to same address.
于 2015-05-06T17:21:03.100 回答