我在引用方面遇到了麻烦。 请考虑以下代码:
void pseudo_increase(int a){a++;}
int main(){
int a = 0;
//..
pseudo_increase(a);
//..
}
此处,变量a
的值不会随着克隆或副本的传递而增加,而不会自动变量。
现在让我们考虑另一个例子:
void true_increase(int& a){a++;}
int main(){
int a = 0;
//..
true_increase(a);
//..
}
这里说a
的价值会增加 - 但为什么呢?
调用true_increase(a)
时,将传递a
的副本。这将是一个不同的变量。因此&a
将与a
的真实地址不同。那么a
的价值如何增加?
纠正我的错误。
答案 0 :(得分:6)
考虑以下示例:
int a = 1;
int &b = a;
b = 2; // this will set a to 2
printf("a = %d\n", a); //output: a = 2
此处b
可以被视为a
的别名。无论您分配给b
的是什么,也会分配给a
(因为b
是对a
的引用)。传递参数by reference
也不例外:
void foo(int &b)
{
b = 2;
}
int main()
{
int a = 1;
foo(a);
printf("a = %d\n", a); //output: a = 2
return 0;
}
答案 1 :(得分:5)
当调用true_increase(a)时,将传递'a'的副本
那就是你错了。将提及a
。这就是参数类型旁边的&
。对引用发生的任何操作都将应用于引用。
答案 2 :(得分:1)
在你的true_increase(int& a)函数中,里面的代码是不是你指定的整数值的COPY。它是对整数值驻留在计算机内存中的内存位置的引用。因此,通过该引用所做的任何更改都将发生在您最初声明的实际整数上,而不是它的副本。因此,当函数返回时,您通过引用对变量所做的任何更改都将反映在原始变量本身中。这是在C ++中通过引用传递值的概念。
在第一种情况下,正如您所提到的,使用原始变量的副本,因此您在函数内所做的任何事情都不会反映在原始变量中。