В чем разница передачи аргументов по ссылке и через указатель?

В чем разница передачи аргументов по ссылке и через указатель? Ведь и в том и в том случае мы работаем с адресом переданного объекта.

void func(int &a)
{
    std::cout << a;
}

void func(int *a)
{
    std::cout << *a;
}

Ответы (3 шт):

Автор решения: Whitehorse

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

Более подробно о тонкостях в аналогичном вопросе

→ Ссылка
Автор решения: user7860670
  • Передача ссылки не обязательно подразумевает работу с адресом переданного объекта.
  • При передаче указателя возможна передача нулевого указателя, т.е. это опциональный аргумент.
  • При передаче ненулевого указателя он может указывать как на отдельный объект, так и на первый объект из массива из нескольких объектов.
  • При передаче указателя возможна передача владения, то бишь ответственности за вызов подходящей функции удаления (delete free и т.п.).
→ Ссылка
Автор решения: HolyBlackCat

Единственное заметное отличие: указатель может быть нулевым, а ссылка нет - она всегда должна указывать на какой-то объект (попытка создать ссылку из нулевого указателя вызывает неопределенное поведение).

Но на уровне машинного кода между передачей по указателю и по ссылке не должно быть разницы, и нет какой-то защиты от создания нулевых ссылок.


Еще небольшая разница в том, что в указатель можно записать новый адрес, и из него можно получить указатель (или ссылку) на указатель, если это зачем-то нужно.

→ Ссылка