В чем разница передачи аргументов по ссылке и через указатель?
В чем разница передачи аргументов по ссылке и через указатель? Ведь и в том и в том случае мы работаем с адресом переданного объекта.
void func(int &a)
{
std::cout << a;
}
void func(int *a)
{
std::cout << *a;
}
Ответы (3 шт):
Основное отличие в том что ссылка разыменовывается автоматически и вам не нужно при вызове функции явно указывать, что вы передаете указатель. И ссылок не было в чистом си,они появились в с++.
- Передача ссылки не обязательно подразумевает работу с адресом переданного объекта.
- При передаче указателя возможна передача нулевого указателя, т.е. это опциональный аргумент.
- При передаче ненулевого указателя он может указывать как на отдельный объект, так и на первый объект из массива из нескольких объектов.
- При передаче указателя возможна передача владения, то бишь ответственности за вызов подходящей функции удаления (
deletefreeи т.п.).
Единственное заметное отличие: указатель может быть нулевым, а ссылка нет - она всегда должна указывать на какой-то объект (попытка создать ссылку из нулевого указателя вызывает неопределенное поведение).
Но на уровне машинного кода между передачей по указателю и по ссылке не должно быть разницы, и нет какой-то защиты от создания нулевых ссылок.
Еще небольшая разница в том, что в указатель можно записать новый адрес, и из него можно получить указатель (или ссылку) на указатель, если это зачем-то нужно.