Подтвердить что ты не робот

Перемещающие указатели на С++

Я работаю над функцией для подстановки указателей, и я не могу понять, почему это не работает. Когда я распечатываю r и s в функции swap, значения меняются местами, что заставляет меня полагать, что я манипулирую с копией, которую я не понимаю, потому что передаю по ссылке p и q.

void swap(int *r, int *s)
{
    int *pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;  
    swap(&p, &q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}

Отпечатки: p = 7q = 9

4b9b3361

Ответ 1

Внутри вашей функции swap вы просто меняете направление указателей, т.е. меняете объекты, на которые указывает указатель (здесь, в частности, это адрес объектов p и q). объекты, на которые указывает указатель, вообще не изменяются.

Вы можете напрямую использовать std::swap. Или запрограммируйте свою функцию свопинга следующим образом:

void swap(int *r, int *s)
{
   int temp = *r;
   *r = *s;
   *s = temp;
   return;
} 

Ответ 2

Строка r=s устанавливает копию указателя r в копию указателя s.

Вместо этого (если вы не хотите использовать std: swap), вам нужно сделать это

void swap(int *r, int *s)
{
    int tmp = *r;
    *r = *s;
    *s = tmp;
}

Ответ 3

Вы передали ссылки на ваши значения, которые не являются указателями. Таким образом, компилятор создает временные (int*) и передает их функции.

Подумайте о том, что p и q: они являются переменными, а это означает, что они расположены в памяти (в стеке, но это не важно здесь). В каком смысле вы можете говорить о "замене указателей"? Это не похоже на то, что вы можете менять адреса слотов.

Что вы можете сделать, это поменять значение двух контейнеров, содержащих фактические адреса, и это указатели.

Если вы хотите поменять указатели, вам нужно создать переменные указателя и передать их функции.

Вот так:

int p = 7;
int q = 9;

int *pptr = &p;
int *qptr = &q;
swap(pptr, qptr);
cout << "p = " << *pptr << "q= " << *qptr << endl;
return 0;

Ответ 4

Вы не передаете ссылку в своем примере. Эта версия проходит по ссылке,

void swap2(int &r, int &s)
{
    int pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;
    swap2(p, q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}

Передача по ссылке не совпадает с передачей по значению или указателем. См. Учебники по С++ в Интернете для объяснения. Мой мозг слишком мал, чтобы сбрасывать клетки, сохраняя мелкие детали, которые я могу найти в Интернете.