ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ В ВЫЗЫВАЮЩЕЙ ПРОГРАММЕ
ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ В ВЫЗЫВАЮЩЕЙ ПРОГРАММЕ
Иногда требуется, чтобы одна функция могла изменять переменные, относящиеся к другой. Например, в задачах сортировки часто бывает необходимо осуществлять обмен значениями между двумя переменными. Предположим, у нас есть две переменные х и у и мы хотим, чтобы они обменялись своими значениями. Простая последовательность операторов
х = у;
y = х;
не является решением поставленной задачи, потому что к тому моменту, когда начнет выполняться оператор во второй строке, первоначальное значение переменной x будет потеряно. Чтобы сохранить это первоначальное значение, необходимо дополнить данный фрагмент еще одной строкой:
temp = х;
х = у;
у = temp;
Теперь у нас есть требуемый метод; реализуем его в виде некоторой функции, а также создадим драйвер для eе проверки. Чтобы сделать более ясным, какая переменная принадлежит функции main( ), а какая - функции interchange( ), мы будем использовать переменные х и у в первой из них, и u и v - во второй.
/* обмен1 */
main( )
{
int х = 5, у = 10;
printf(" Вначале х = %d и у = %d. " , х, у);
interchange(x, у);
prinlf(" Теперь х = %d и у = %d. " , х, у);
}
interchangce(u, v) int u, v;
{
int temp;
temp = u;
u = v;
v = temp;
}
Попробуем выполнить эту программу. Результаты будут выглядеть следующим образом:
Вначале х = 5 и у = 10.
Теперь х = 5 и у = 10.
Не может быть! Значения переменных не поменялись местами! Вставим в программу interchange( ) несколько операторов печати, чтобы понять причину допущенной ошибки.
/* обмен2 */
main( )
{
int х = 5, у = 10;
printf(" Вначале х = %d и у = %d. ", х,у);
interchange(x, у);
printf(" Теперь х = %d и у = %d. ", х, у);
}
interchange(u, v)
int u, v;
{
int temp;
printf(" Вначалеu = %d иv = %d. ", u, v);
temp = u;u = v;v = temp;
printf(" Теперь u = %d и v = %d. ", u, v);
}
Результат работы этой программы выглядит так:
Вначале x = 5 и y = 10.
Вначале u = 5 и v = 10.
Вначале u = 10 и v = 5.
Вначале x = 5 и y = 10.
Отсюда видно, что ничего неправильного в работе функции interchange( ) нет; она осуществляет обмен значениями между переменными u и v. Проблема состоит в передаче результатов обратно в функцию main( ). Как мы уже указывали, функции interchange( ) и main() используют различные переменные, поэтому обмен значениями между переменными u и v не оказывает никакого влияния на х и у! А нельзя ли каким-то образом воспользоваться оператором return? Мы могли бы, конечно, завершить тело функции interchange( ) строкой
return(u);
и изменить форму вызова в функции main( ) следующим образом:
х = interchange(x, у);
В результате такого обращения к функции переменная х получит новое значение, но у при этом не изменится.
С помощью оператора return в вызывающую программу можно передать только одну величину. Но нам нужно передать две величины. Это оказывается вполне осуществимым! Для этого нужно лишь воспользоваться "указателями".