2014-09-24 1 views
0

Я очень смущен указателями C++ и справочными операторами. Моя основная путаница заключается в следующем (простой) код:Pointer Confusion with C++

#include <iostream> 

using namespace std; 

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

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

    return 0; 
} 

В основном, я запутался, почему изменение адреса (& а) изменяет фактическую переменную (п). Когда я впервые попытался решить эту проблему, это был мой код:

#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/ –

+0

@ Asad-ullahKhan: нет, это не так: страница рассказывает о '&' операторе, но ваш (вы объявляете ссылку, с 'int &') – quantdev

+0

OHHH, которая имеет больше смысла! Спасибо вам! –

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 thread и wikipedia entry, чтобы узнать больше.

1

Амперсанд указывает, что переменная передается по ссылке на вашу функцию, но внутри функции переменная обрабатывается так, как если бы она передавалась по значению. Это syntactic sugar, чтобы написать код, который принимает ссылки, более простые для понимания.