Разница между вызовом по ссылке и вызовом по указателю

Может ли кто-нибудь сказать мне точную разницу между вызовом по указателю и вызовом по ссылке. Собственно, что происходит в обоих случаях?

Например:

Вызов по ссылке:

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. Преимущество использования указателей заключается в том, что вы можете манипулировать самим адресом. Иногда вам нужно будет изменить адрес (указать его на что-то еще...), когда указатели отличаются для ссылок; указатели позволяют работать непосредственно с адресом, ссылка не будет