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

时间:2017-09-19 03:54:51

标签: c++ reference pass-by-reference

我是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的地址作为参数,所以当我们在main中调用callByRef时,为什么我们需要传入(k,m)而不是(& k, &上午下午)?

这是基本的,但我只想为未来的学习找到正确的图片。 谢谢你们!

3 个答案:

答案 0 :(得分:2)

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

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

其中int &a表示a将是某个int类型变量的reference。因此,无论何时你需要调用函数,你需要传递变量本身而不是它的地址,因此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)

答案 1 :(得分:0)

callByRef()函数将引用作为参数传递,因此您不需要发送对函数的显式引用。请仔细阅读以便更好地理解。

Tutorial

答案 2 :(得分:0)

您没有传递该值。 C ++中的引用与指针不完全相同。将它们视为对象的另一个名称。

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

这同样适用于函数参数和参数。指定函数callByRef以对将调用ab的两个对象进行操作。当您调用该函数时,您必须命名它将引用的原始对象。原始对象的名称为km,而不是&k&m