Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015

Здесь есть возможность читать онлайн «Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Год выпуска: 0101, Издательство: Вильямс, Жанр: Старинная литература, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Язык программирования C. Лекции и упражнения (6-е изд.) 2015: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Язык программирования C. Лекции и упражнения (6-е изд.) 2015»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Язык программирования C. Лекции и упражнения (6-е изд.) 2015», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

pooh = 24;

Предположим, что адресом, по которому хранится переменная pooh, является 0В76. (В IBM PC адреса часто задаются в виде шестнадцатеричных значений.) Тогда оператор

printf("%d %p\n", pooh, &pooh); выведет следующий результат (%р — спецификатор для адресов):

24 0В76

В листинге 9.12 эта операция применяется, чтобы посмотреть, где хранятся переменные, которые имеют одно и то же имя, но используются в разных функциях.

Листинг 9.12. Программа loccheck.c

Для вывода адресов в листинге 912 указан формат р из ANSI С В нашей системе - фото 260

Для вывода адресов в листинге 9.12 указан формат %р из ANSI С. В нашей системе был получен следующий вывод:

Внутри main() pooh = 2 и &pooh = 0x7fff5fbff8e8 Внутри main() bah = 5 и &bah = 0x7fff5fbff8e4 Внутри mikado() pooh = 10 и &pooh = 0x7fff5fbff8b8 Внутри mikado() bah = 2 и &bah = 0x7ff f 5fbf f8bc

Способ представления адреса спецификатором %р варьируется между реализациями. Однако многие реализации вроде той, что применяется в этом примере, отображают адрес в шестнадцатеричной форме. Учитывая, что каждая шестнадцатеричная

Функции 355

цифра соответствует четырем битам, показанные адреса, состоящие из 12 цифр, соответствуют 40-битным адресам.

Что демонстрирует приведенный вывод? Во-первых, две переменные pooh имеют отличающиеся адреса. То же самое справедливо и для двух переменных bath. Таким образом, как было обещано ранее, компьютер рассматривает их как четыре разных переменных. Во-вторых, вызов mikado (pooh) передает значение (2) фактического аргумента (pooh из main()) формальному аргументу (bah из mikado()). Обратите внимание, что было передано просто значение. Обе переменные (pooh из main() и bah из mi kado()) сохраняют свою идентичность.

Второй аспект был отмечен особо из-за того, что так дело обстоит не во всех языках. Например, в FORTRAN подпрограмма воздействует на исходную переменную в вызывающей процедуре. Переменная подпрограммы может иметь другое имя, но адрес будет тем же. В языке С это не так. Каждая функция использует собственные переменные. Такой подход предпочтительнее, поскольку он предотвращает загадочное изменение исходной переменной вследствие какого-то побочного эффекта вызванной функции. Тем не менее, этот подход также может создавать определенные трудности, как будет показано в следующем разделе.

Изменение переменных в вызывающей функции

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

х = у;

у = х;

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

temp = х;

х = у;

у = temp;

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

Листинг9.13. Программа swapl.c

356 глава 9 void interchangeint u int v определение функции int - фото 261

356 глава 9 void interchange(int u, int v) /* определение функции */

{

int temp;

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

)

Выполнение этой программы дает следующие результаты:

Первоначально х = 5 и у = 10.

Теперь х = 5 и у = 10.

Как видите, значения не поменялись. Чтобы посмотреть, что именно пошло не так, давайте добавим в функцию interchange() несколько операторов вывода (листинг 9.14).

Листинг 9.14. Программа swap2.c

Вот новый вывод Первоначально х 5 и у 10 Первоначально и 5 и v 10 - фото 262

Вот новый вывод:

Первоначально х = 5 и у = 10.

Первоначально и = 5 и v = 10.

Теперь и = 10 и v = 5.

Теперь х = 5 и у = 10.

С функцией interchange() все в порядке; она меняет местами значения и и v. Проблема возникает при передаче результатов в main(). Как было указано, в interchange() применяются переменные, отличающиеся от используемых в main(), так что обмен значениями между и и v не влияет на переменные хну. Может быть, каким-то образом применить return?

Что же, функцию interchange() можно было бы завершить строкой

return(и);

Функции 357

а затем заменить ее вызов в main() следующим образом:

х = interchange(х,у);

Это изменение приводит к тому, что х получает новое значение, но значение у остается незатронутым. С помощью return обратно в вызывающую функцию можно отправлять только одно значение, а нам нужно передать два значения. Но все-таки это можно сделать! Понадобится только воспользоваться указателями.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Язык программирования C. Лекции и упражнения (6-е изд.) 2015»

Представляем Вашему вниманию похожие книги на «Язык программирования C. Лекции и упражнения (6-е изд.) 2015» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Язык программирования C. Лекции и упражнения (6-е изд.) 2015»

Обсуждение, отзывы о книге «Язык программирования C. Лекции и упражнения (6-е изд.) 2015» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x