Страницы

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

понедельник, 10 декабря 2018 г.

Передача в функцию указателя или ссылки [дубликат]

На данный вопрос уже ответили: Чем отличаются ссылки от указателей в С++ 2 ответа В чем будет разница, если в функцию передать указатель и ссылку? например
#include void func(int *a) { *a = 5 } int main() { int a; func(a); std::cout << a; }
и
#include void func(int &a) { a = 5 } int main() { int a; func(a); std::cout << a; }
Программы выведут одно и то же? Ведь и так, и так мы обращаемся к существующему элементу, а не создаем новый.


Ответ

В принципе, технически разница между указателем и ссылкой лишь в том, что саму ссылку нельзя изменить (а указатель можно). [Вот тут бóльший список отличий.] Кроме этого, разница ещё синтаксическая: с ссылкой вы обращаетесь как будто это переменная, а с указателем нужно его правильно получать/разыменовывать:
void func(int *a) { *a = 5; } int main() { int a; func(&a); cout << a; }
Других технических отличий нет, и результат будет одинаковый.
Но разница на самом деле не в синтаксисе, а в смысле, в семантике.
Указатель может означать всё, что угодно. Он в C и C++ означает строку, ассив, адрес переменной, передачу переменной по ссылке и ещё кучу всяких вещей. А смысл ссылки ровно один — это как бы альтернативное имя (alias) существующей переменной.
Поэтому для случаев наподобие того, который вы описали, в C++ уместно использовать ссылку, а не указатель. Хотя, как вы сами видите, с указателем тоже прекрасно работает.
И ещё: в чистом C ссылок нет, так что у вас нет другого варианта кроме указателей.

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

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