Чтобы заставить функцию работать так, как нужно, следует передавать в нее не значения переменных x и y, а их адреса. Для этого необходимо выполнить следующее:
1. Формальные параметры функции объявить указателями (для того, чтобы в них можно было записывать адреса фактических параметров).
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
2. Изменить вызов функции. Т.к. теперь она ожидает получить указатели, то необходимо передавать адреса фактических параметров x и у:
swap(&x, &y);
Теперь в функцию передаются адреса. И работа ведется относительно переданных адресов:
Таким образом, если функция должна менять значение переменной, нужно передавать ей адрес этой переменной.
Примечание: У тех, кто только начинает программировать на C, есть одна распространенная ошибка. При вводе с клавиатуры с помощью функции scanf() они передают значение переменной, а не ее адрес. В этом случае функция scanf(), используя полученное значение в качестве адреса, будет работать неверно.