Мы коснулись второго вопроса потому, что этот факт оказывается неверным для всех других языков. В той или иной процедуре Фортрана, например, можно использовать переменные вызывающей программы. Кроме того, в такой процедуре переменные могут иметь различные имена, но адреса их при этом будут совпадать. В языке Си подобные механизмы отсутствуют. Каждая функция использует свои собственные переменные. Это более предпочтительно, потому что "исходные" переменные не будут таинственным образом изменяться из-за того, что вызванная функция обладает побочным эффектом. Но это может также приводить и к некоторым трудностям, о чем и будет рассказано и следующем разделе.
ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ В ВЫЗЫВАЮЩЕЙ ПРОГРАММЕ
Иногда требуется, чтобы одна функция могла изменять переменные, относящиеся к другой. Например, в задачах сортировки часто бывает необходимо осуществлять обмен значениями между двумя переменными. Предположим, у нас есть две переменные хи уи мы хотим, чтобы они обменялись своими значениями. Простая последовательность операторов
х = у;
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 в вызывающую программу можно передать только одну величину . Но нам нужно передать две величины. Это оказывается вполне осуществимым! Для этого нужно лишь воспользоваться " указателями ".
Указатели: первое знакомство
Указатели? Что это такое? Вообще говоря, указатель - некоторое символическое представление адреса. Например, ранее мы воспользовались операцией получения адреса для нахождения адреса переменной pooh. В данном случае &poohозначает "указатель на переменную pooh". Фактический адрес - это число (в нашем случае 56002), а символическое представление адреса &poohявляется константой типа указатель. После всего сказанного выше становится очевидным, что адрес ячейки, отводимой переменной pooh, в процессе выполнения программы не меняется.
Читать дальше