我是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, &上午下午)?
这是基本的,但我只想为未来的学习找到正确的图片。 谢谢你们!
答案 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()函数将引用作为参数传递,因此您不需要发送对函数的显式引用。请仔细阅读以便更好地理解。
答案 2 :(得分:0)
您没有传递该值。 C ++中的引用与指针不完全相同。将它们视为对象的另一个名称。
当然,你需要将该名称绑定到一个对象,以便引用引用它。因此,例如,当我们写int &i = k;
时,我们说已经命名为k
的变量可能被称为i
。要绑定引用,我们需要命名另一个对象。对象的名称为k
,而不是&k
。
这同样适用于函数参数和参数。指定函数callByRef
以对将调用a
和b
的两个对象进行操作。当您调用该函数时,您必须命名它将引用的原始对象。原始对象的名称为k
和m
,而不是&k
和&m
。