我对c ++指针和引用运算符非常困惑。我的主要困惑是以下(简单)代码:
#include <iostream>
using namespace std;
void changeInt(int &a)
{
a *= 3;
}
int main()
{
int n = 3;
changeInt(n);
cout << n << endl;
return 0;
}
主要是,我很困惑为什么更改地址(&amp; a)会改变实际变量(n)。当我第一次尝试这个问题时,这是我的代码:
#include <iostream>
using namespace std;
void changeInt(int &a)
{
*a *= 3;
}
int main()
{
int n = 3;
changeInt(n);
cout << n << endl;
return 0;
}
但这给了我一个错误。为什么当我更改地址时它会更改变量,但是当我更改地址指向的值时,我会收到错误?
答案 0 :(得分:3)
你的第二个例子是无效的C ++,你只能取消引用一个指针(或一个类型超载operator*
的对象,这不是你的情况)。
您的第一个示例通过引用传递参数(int &a
不是&#34;&#34;的地址,它是对a的引用,这就是为什么更改为a
实际上是对函数传递的对象的更改(在您的情况下为n
)
答案 1 :(得分:2)
该上下文中的&符号(&
)表示引用,而不是“地址”。 E.g:
int some_int;
int & a = some_int; // Declare 'a', a reference to 'some_int'
int * p = &some_int; // '&' in this context is "the address of" 'some_int'
引用在很多方面等同于指针,但它的行为类似于值类型。 请参阅this thread和wikipedia entry了解详情。
答案 2 :(得分:1)
&符号表示变量是通过引用函数传递的 - 但在函数内部,变量被视为按值传递。这是syntactic sugar,以使编写接受引用更容易理解的代码。