Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Амперсанд в параметрах функции

#cpp


Здравствуйте, подскажите пожалуйста, как это работает? Допустим, имеется такая функция:

void foo(int &one, int two){
    one = two;
}

int s1 = 1;
int s2 = 2;
foo(s1, s2);


Как работает амперсанд перед параметром функции one? Я понимаю, что функция работает
с переменной, которая выделена в статической памяти. Выходит, что мы передаем в функцию
значение типа int, затем берем его адрес. Но почему в теле функции можем работать с
ним как с обычной переменной, а не как с указателем? По идее, нужно было бы разыменовывать. 

Такая конструкция понятна:

void foo(int* one, int two)
{ 
   *one = two;
}


и при вызове функции передаем так параметры (&s1, s2);.
    


Ответы

Ответ 1



А потому и пишем &, чтобы можно было писать one = two, а не *one = two. Тут вся суть в том, что явно указатель передают когда хотят работать непосредственно с ним, когда нужно знать его значение. Когда же мы хотим работать со значением переменной, но не только в функции в которой она создана, но и в «потомственных», то мы передаём её по ссылке. Вы конечно можете сказать что-нибудь типа «мне это непривычно, я лучше буду передавать адреса явно», но поверьте — передача переменной по ссылке в случае, если надо работать с самой переменной — правильный подход к программированию. Хороший программист обязан уметь писать ХОРОШИЙ код — не только алгоритмически эффективный, но и максимально понятный; такой, чтобы его суть была понятна другому программисту, даже впервые его увидевшему. В языке C# передача переменной по ссылке выглядит более красиво, там просто и в вызывающем, и в вызываемом методах перед переменной пишется слово ref (или out, что идёт там по смыслу «дополнительное возвращаемое значение»).

Ответ 2



почитайте код ниже, думаю разберетесь #include using namespace std; int main(){ int value = 0; // переменная инициализированная нулем cout << value << endl; // выведет нуль int & link = value; // ссылка на переменную (не может существовать без указания имени переменной) link = 100; // через ссылку записываем в переменную значение 100 cout << value << endl; // выведет 100 return 0; } тоже самое происходит и при передачи ссылки в функцию. ссылка - это всего лишь второе имя переменной (псефдоним)

Комментариев нет:

Отправить комментарий