Вход/Регистрация
Язык Си - руководство для начинающих
вернуться

Д. МАРТИН

Шрифт:

/* обмен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, в процессе выполнения программы не меняется.

В языке Си имеются и переменные типа указатель. Точно так же как значением переменной типа char является символ, а значением переменной типа int– целое число, значением переменной типа указатель служит адрес некоторой величины. Если мы дадим указателю имя ptr, то сможем написать, например, такой оператор

ptr = &pooh; /* присваивает адрес pooh переменной ptr */

Мы говорим в этом случае, что ptr "указывает на" pooh. Различие между двумя формами записи: ptr и &pooh, заключается в том, что ptr– это переменная, в то время как &pooh– константа. В случае необходимости мы можем сделать так, чтобы переменная ptr указывала на какой-нибудь другой объект:

ptr = &bah; /* ptr указывает на bah, а не на pooh */

Теперь значением переменной ptr является адрес переменной bah.

Операция косвенной адресации: *

Предположим, мы знаем, что в переменной ptr содержится ссылка на переменную bah. Тогда для доступа к значению этой переменной можно воспользоваться операцией "косвенной адресации" (*). (Не путайте эту унарную операцию косвенной адресации с бинарной операцией умножения *).

  • Читать дальше
  • 1
  • ...
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: