Я вроде новичок с этими алгоритмами / техниками, но я придумал эту функцию;
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
Вот трехэтапное объяснение для лучшего понимания;
*p1 = *p1 + *p2;
Добавьте значения из p1 (* p1 = 10) и p2 (* p2 = 20) и сохраните результат в p1 (* p1 = 30) . *p2 = *p1 - *p2;
Мы знаем результат сложения, вычисляем старое значение p1 , вычитая текущее значение p2 (current * p2= 20) от значения, полученного из p1 (* p1 = 30) и сохранение результата в p2 (вычислено * p2 = 10). *p1 = *p1 - *p2;
Так как значение p1 (* p1 = 30) не изменилось на шаге 2, и мы все еще имеем старое значение p1 на p2 (* p2 = 10) , мы можем разделить p2 на p1 и сохранить результат на p1 (вычислено * p1 = 20)
Итак, как вы можете видеть, мы поменяли местами две int
s без определения какой-либо временной переменной и выполнение функции передачи по ссылке.
Причина передачи по ссылке заключается в минимизации использования памяти.Поскольку каждый вызов с передачей по значению выделяет в памяти новые переменные (которые будут удалены GC или нет), зависит от того, сколько параметров вы передали в функцию.