C++ 为什么我们必须将值而不是地址传递到一个";“参考电话”;C+中的函数+;?

C++ 为什么我们必须将值而不是地址传递到一个";“参考电话”;C+中的函数+;?,c++,reference,pass-by-reference,C++,Reference,Pass By Reference,我在我的材料中学习了这段代码: 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的地址作为

我在我的材料中学习了这段代码:

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,&m)

这是基本的,但我只是想为我未来的学习做好准备。 谢谢大家

callByRef()函数将引用作为参数传递,因此不需要向函数发送显式引用。通读这篇文章以便更好地理解

callByRef()函数将引用作为参数传递,因此不需要向函数发送显式引用。通读这篇文章以便更好地理解


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

void callByRef(int &a, int &b){
    a += 3;
    b -= 2;
    return;
}
其中
int&a
意味着a将是int类型的某个变量的a。因此,无论何时调用函数,都需要传递变量本身而不是它的地址,因此
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)
&a的运算符表示变量a的地址,
*a的运算符表示变量a所寻址的内存内容。现在函数定义如下:

void callByRef(int &a, int &b){
    a += 3;
    b -= 2;
    return;
}
其中
int&a
意味着a将是int类型的某个变量的a。因此,无论何时调用函数,都需要传递变量本身而不是它的地址,因此
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)

您不传递值。C++中的引用不完全像指针。将它们简单地看作是对象的另一个名称

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


这同样适用于函数参数和参数。函数
callByRef
指定用于对它将调用的
a
b
两个对象进行操作。调用该函数时,必须命名它将引用的原始对象。并且原始对象被命名为
k
m
,而不是
&k
&m

,如果不传递值。C++中的引用不完全像指针。将它们简单地看作是对象的另一个名称

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


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

“我们使用a和b的地址作为参数”什么?声明应该类似于
void callByRef(int&a,int&b)
,它不是将参数的地址作为引用来声明。
void callByRef(&a,&b)
。如果这就是你的课程材料所包含的内容,你应该抱怨并要求退款。“我们使用a和b的地址作为参数”什么?声明应该类似于
void callByRef(int&a,int&b)
,它不是将参数的地址作为引用来声明。
void callByRef(&a,&b)
。如果这就是你的课程内容,你应该抱怨并要求退款。谢谢你的回答哈哈哈烤肉串!现在就读吧。谢谢你的回答哈哈哈烤肉串!现在读吧。