2014-09-24 146 views
0

我很困惑C++指针和引用操作符。我的主要困惑是以下(简单)的代码:指针与C++混淆

#include <iostream> 

using namespace std; 

void changeInt(int &a) 
{ 
    a *= 3; 
} 

int main() 
{ 
    int n = 3; 
    changeInt(n); 
    cout << n << endl; 

    return 0; 
} 

主要是,我很困惑,为什么改变地址(&一)改变实际变量(n)。当我第一次尝试这个问题时,这是我的代码:

#include <iostream> 

using namespace std; 

void changeInt(int &a) 
{ 
    *a *= 3; 
} 

int main() 
{ 
    int n = 3; 
    changeInt(n); 
    cout << n << endl; 

    return 0; 
} 

但是这给了我一个错误。为什么当我更改地址时会更改变量,但是当我更改地址指向的值时出现错误?

回答

3

你的第二个例子是无效的C++,你只能取消引用一个指针(或一个对象的类型超载operator*,这不是你的情况)。

你的第一实例通过参考传递参数int &a不是“的地址的”,这是一个参照本发明的),这就是为什么改变到a真的是一个变化的对象由被传递函数(在你的情况下,n

+0

但在这里它另有说明:http://www.cplusplus.com/doc/tutorial/pointers/ – 2014-09-24 03:18:41

+0

@ Asad-ullahKhan:不,它不会:页面提及'&'操作符,但是您的没有使用它(你正在声明一个引用,用int&') – quantdev 2014-09-24 03:19:48

+0

OHHH,这更有意义!谢谢! – 2014-09-24 03:20:42

2

上下文中的和号(&)表示参考,而不是“地址”。例如:

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 threadwikipedia entry了解更多信息。

1

&符号表示一个变量是通过引用传递给你的函数 - 但在函数内部,变量被视为按值传递。这是syntactic sugar,使编写接受引用的代码更容易理解。