Я вроде нового с ними алгоритмы/методы, но я придумал эту функцию;
function swap(int *p1, int *p2) {
*p1 = *p1 + *p2;
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;
}
Вы можете проверить эту функцию следующим образом;
int a = 10;
int b = 20;
printf("%d %d\n", a, b); // 10 20
swap(&a, &b);
printf("%d %d\n", a, b); // 20 10
Вот 3 шага объяснение для лучшего понимания;
*p1 = *p1 + *p2;
Добавьте значения, поступающие из p1(* p1 = 10) и р2(* р2 = 20) и хранить результат по p1(* р1 = 30).
*p2 = *p1 - *p2;
Мы знаем, что результат сложения, вычислите старое значение p1 путем вычитания текущего значения p2(ток * p2 = 20) от стоимости поступающих из p1(* p1 = 30) и результаты поиска на p2(рассчитано * p2 = 10).
*p1 = *p1 - *p2;
Поскольку значение p1(* p1 = 30) не изменился на шаге 2, и мы до сих пор старое значение p1 на p2(* p2 = 10) , мы можем разделить p2 Into p1, и сохранить результат на p1(* рассчитано p1 = 20)
Итак, как вы можете видеть, мы обменяли два int
s без определения какой-либо временной переменной и совершили вызов функции передачи по ссылке.
Причина передачи по ссылке заключается в минимизации использования памяти. Поскольку каждый вызов по каждому значению выделяет новые переменные в памяти (для удаления GC или нет), зависит от того, сколько параметров вы передали функции.
У вас есть ответ на ваш вопрос, поэтому я не совсем уверен, почему его нужно было спросить ... –
Вы также можете использовать [XOR swap] (http://en.wikipedia.org/wiki/XOR_swap_algorithm) для указателей подкачки, а также ... –
@ 0x69 Удовлетворительный факт: если вы XOR замените два указателя одинаковыми, то оба они будут установлены в указатель NULL. – Corbin