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