繁体   English   中英

为什么我们必须将值而不是地址传递给C ++中的“按引用调用”函数?

[英]Why we have to pass the values instead of the address into a “call by reference” function in C++?

我是C ++的新手,现在开始通过引用学习调用。

我在资料中学习了以下代码块:

void callByRef(&a, &b);

int main(){
    int k = 12;
    int m = 4;
    callByRef(k, m) //QUESTION HERE
    return 0;
}

void callByRef(&a, &b){
    a += 3;
    b -= 2;
    return;
}

所以我的问题是,在声明callByRef时,我们使用a和b的地址作为参数,因此当我们在主体中调用callByRef时,为什么需要传递(k,m)而不是(&k,&m)?

这是基本的,但是我只是想为将来的学习提供正确的画面。 多谢你们!

&a的运算符表示变量a的地址, *a的运算符表示变量a寻址的存储器的内容。 现在,函数定义如下:

void callByRef(int &a, int &b){
    a += 3;
    b -= 2;
    return;
}

其中int &a表示a将是 int类型的某些变量的引用 因此,每当您要调用该函数时,都需要传递变量本身而不是其地址,即callByRef(a, b)而不是callByRef(&a, &b)

这样声明的原因如下:传递给函数的参数,传递给值的变量,即按字面意义复制到函数变量中的变量的内容,因此,在函数内部对其进行的任何更改均无效。 例如:

void callByVal(int a, int b){
    a += 3;
    b -= 2;
    return;
}

并且具有:

x = 5;
y = 10;

调用callByVal(x, y)对x和y无效。 为了克服这个问题,您需要通过引用或int &a传递参数,或者作为替代方案,您可以传递指针并直接更新内存:

void callByPtr(int *a, int *b){
    *a += 3;
    *b -= 2;
    return;
}

现在可以传递变量地址了,例如callByPtr(&a, &b)

callByRef()函数将引用作为参数传递,因此您无需将显式引用发送给该函数。 通读此书可以更好地理解。

讲解

您不会传递值。 C ++中的引用与指针不完全一样。 可以将它们视为对象的另一个名称。

自然,您需要将该名称绑定到对象,以便引用引用该对象。 例如,当我们写int &i = k; 我们是说已经命名为k的变量可以称为i 要绑定引用,我们需要命名另一个对象。 对象的名称是k ,而不是&k

函数参数和参数也是如此。 函数callByRef被指定为对两个对象进行操作,它将调用ab 调用该函数时,必须命名它将引用的原始对象。 并且原始对象被命名为km ,而不是&k&m

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM