Книга: Язык Си - руководство для начинающих

ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ В ВЫЗЫВАЮЩЕЙ ПРОГРАММЕ

     Иногда требуется, чтобы одна функция могла изменять переменные, относящиеся к другой. Например, в задачах сортировки часто бывает необходимо осуществлять обмен значениями между двумя переменными. Предположим, у нас есть две переменные х и у и мы хотим, чтобы они обменялись своими значениями. Простая последовательность операторов

х = у;

y = х;

не является решением поставленной задачи, потому что к тому моменту, когда начнет выполняться оператор во второй строке, первоначальное значение переменной x будет потеряно. Чтобы сохранить это первоначальное значение, необходимо дополнить данный фрагмент еще одной строкой:

temp = х;

х = у;

у = temp;

     Теперь у нас есть требуемый метод; реализуем его в виде некоторой функции, а также создадим драйвер для eе проверки. Чтобы сделать более ясным, какая переменная принадлежит функции main( ), а какая - функции interchange( ), мы будем использовать переменные х и у в первой из них, и u и v - во второй.

/* обмен1 */

main( )

{

int х = 5, у = 10;

printf(" Вначале х = %d  и у = %d.n" , х, у);

interchange(x, у);

prinlf(" Теперь х = %d и у = %d.n" , х, у);

}

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.n", х,у);

interchange(x, у);

printf(" Теперь х = %d и у = %d.n", х, у);

}

 interchange(u, v)

int u, v;

{

 int temp;

printf(" Вначалеu = %d иv = %d.n",  u, v);

temp = u;u = v;v = temp;

printf(" Теперь u = %d и  v = %d.n", 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 в вызывающую программу можно передать только одну величину. Но нам нужно передать две величины. Это оказывается вполне осуществимым! Для этого нужно лишь воспользоваться "указателями".

Оглавление книги


Генерация: 0.088. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз