Перемещающие указатели на С++
Я работаю над функцией для подстановки указателей, и я не могу понять, почему это не работает. Когда я распечатываю 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
Ответы
Ответ 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;
}
Передача по ссылке не совпадает с передачей по значению или указателем. См. Учебники по С++ в Интернете для объяснения. Мой мозг слишком мал, чтобы сбрасывать клетки, сохраняя мелкие детали, которые я могу найти в Интернете.