2013-06-20 2 views
1
void ChangeValueByReference(int &x) 
{ 
    x = 0; 
} 

int main() 
{ 
    int a = 1; 
    ChangeValueByReference(a); 
    cout << a; 
} 

Почему мы не ставим ChangeValueByReference(&a); при вызове этой функции в main()?Когда мы переходим по ссылке, почему мы выставляем переменную вместо адреса (указателя) при вызове функции?

Поскольку при определении функции, мы сказали, что мы будем передаем указатель void ChangeValueByReference(int &x){...}

ответ

3

Это потому, что амперсанд имеет два разных значения, если они используются в разных местах (декларация/заявлении).

void MyFn(Type & a); 

Здесь & "служит ссылкой на" модификатора.

Type * pA = &a; 

Здесь & служит "получить указатель" оператора. Обратите внимание, что если у вас есть переменная a типа Type, &a возвращает Type * (указатель на Type).

Компилятор автоматически получает ссылку на переменную, когда вы передаете ее функции. Поэтому вы можете просто позвонить:

ChangeValueByReference(someVariable); 

И компилятор будет знать, что он должен получить ссылку на someVariable.

+0

спасибо за помощь – user2479918

+0

Рад, что я мог помочь :) – Spook

+0

* «получить указатель на« оператор »часто называют« адресным оператором »или [« адрес-оператора »] (http://msdn.microsoft .com/EN-US/библиотека/64sa8b1e% 28В = vs.110% 29.aspx) –

1

Мы не сказали, что будем передавать указатель. Мы сказали, что дадим ссылку. Ссылка на переменную может внутренне обрабатываться как указатель , но это не указатель. Указатель может быть 0 - ссылка не указана.

Смежные вопросы