Разница между вызовом по ссылке и вызовом по указателю
Может ли кто-нибудь сказать мне точную разницу между вызовом по указателю и вызовом по ссылке. Собственно, что происходит в обоих случаях?
Например:
Вызов по ссылке:
void swap(int &x, int &y)
{
int temp;
temp = x; /* save the value at address x */
x = y; /* put y into x */
y = temp; /* put x into y */
return;
}
swap(a, b);
Вызов по указателю:
void swap(int *x, int *y)
{
int temp;
temp = *x; /* save the value at address x */
*x = *y; /* put y into x */
*y = temp; /* put x into y */
return;
}
swap(&a, &b);
Ответы
Ответ 1
Оба случая делают то же самое.
Однако небольшая разница заключается в том, что ссылки никогда не являются нулевыми (и внутри функции вы уверены, что они ссылаются на действительную переменную). С другой стороны, указатели могут быть пустыми или могут указывать на недопустимое место в памяти, вызывая AV.
Ответ 2
Семантически эти вызовы имеют одинаковые результаты; под капотом ссылки выполняются с указателями.
Важное различие между использованием ссылок и указателями - это ссылки, в которых у вас гораздо меньше веревки, чтобы повесить себя. Ссылки всегда указывают на "что-то", где указатели могут указывать на что-либо. Например, вполне возможно сделать что-то вроде этого
void swap(int *x, int *y)
{
int temp;
temp = *x; /* save the value at address x */
++x;
*x = *y; /* put y into x */
*y = temp; /* put x into y */
return;
}
И теперь этот код может что-то сделать, сбой, запуск, обезьяны вылетают из ваших носов, что угодно.
Если есть сомнения, предпочитайте ссылки. Это более высокий, более безопасный уровень абстракции на указателях.
Ответ 3
В вашем примере нет разницы.
В С++ ссылка реализуется с помощью указателей.
Изменить: для тех, кто считает ссылку не может быть NULL:
int calc(int &arg)
{
return arg;
}
int test(int *arg)
{
return calc(*arg);
}
Угадайте, каков будет результат для test(0)
?
Ответ 4
Ваш код - код на С++. В Java нет указателей. Оба примера делают одно и то же, функционально нет разницы.
Ответ 5
Я не знаю точно, почему это было отмечено как jave, поскольку нет указателей. Однако для концепции вы можете использовать оба указателя и ссылку взаимозаменяемо, если вы работаете над атрибутом value. например я = 4 или * я = 4. Преимущество использования указателей заключается в том, что вы можете манипулировать самим адресом. Иногда вам нужно будет изменить адрес (указать его на что-то еще...), когда указатели отличаются для ссылок; указатели позволяют работать непосредственно с адресом, ссылка не будет