Использование указателей для связи между функциями
Использование указателей для связи между функциями
Мы только прикоснулись к обширному и увлекательному миру указателей. Сейчас нашей целью является использование указателей для решения задачи об установлении связи между функциями. Ниже приводится программа, в которой указатели служат средством, обеспечивающим правильную работу функции, которая осуществляет обмен значениями переменных. Посмотрим, как она выглядит, выполним ее, а затем попытаемся понять, как она работает.
/* обмен3 */
main( )
{
int x = 5, у = 10;
printf(" Вначале x = %d и у = %d. " , x, у);
interchange(&x,&y); /* передача адресов функции */
printf(" Теперь x = %d и у = %d. ", x, у);
}
interchange(u, v)
int *u, *v; /* u и v являются указателями */
{
int temp;
temp = *u; /* temp присваивается значение, на которое указывает u */
*u = *v;
*v = temp;
}
После всех встретившихся трудностей, проверим, работает ли этот вариант 1
Вначале x = 5 и y = 10.
Теперь x = 10 и y = 5.
Да программа работает. Посмотрим, как она работает. Во-первых, теперь вызов функции выглядит следующим образом:
interchange(&x, &y);
Вместо передачи значений х и у мы передаем их адреса. Это означает, что формальные аргументы u и v, имеющиеся в спецификации:
interchange(u,v)
при обращении будут заменены адресами и, следовательно, они должны быть описаны как указатели. Поскольку х и у - целого типа, u и v являются указателями на переменные целого типа, и мы вводим следующее описание:
int *u, *v;
Далее в теле функции оператор описания:
int temp;
используется с целью резервирования памяти. Мы хотим поместить значение переменной х в переменную temp, поэтому пишем:
temp = *u;
Вспомните, что значение переменной u - это &х, поэтому переменная u ссылается на х. Это означает, что операция *u дает значение x, которое как раз нам и требуется. Мы не должны писать, например, так:
temp = u; /* неправильно */
поскольку при этом происходит запоминание адреса переменной х, а не ее значения; мы же пытаемся осуществить обмен значениями, а не адресами.
Точно так же, желая присвоить переменной у значение переменной х, мы пользуемся оператором:
*u = *v;
который соответствует оператору
x = y;
Подведем итоги. Нам требовалась функция, которая могла бы изменять значения переменных х и у. Путем передачи функции адресов переменных х и у мы предоставили ей возможность доступа к ним. Используя указатели и операцию *, функция смогла извлечь величины, помещенные в соответствующие ячейки памяти, и поменять их местами.
Вообще говоря, при вызове функции информация о переменной может передаваться функции в двух видах. Если мы используем форму обращения:
function1(х);
происходит передача значения переменной х. Если же мы используем форму обращения:
function2(&x);
происходит передача адреса переменной х. Первая форма обращения требует, чтобы определение функции включало в себя формальный аргумент того же типа, что и х:
functionl(num)
int num;
Вторая форма обращения требует, чтобы определение функции включало в себя формальный аргумент, являющийся указателем на объект соответствующего типа:
function2(ptr)
int *ptr;
Пользуйтесь первой формой, если входное значение необходимо функции для некоторых вычислений или действий, и второй формой, если функция должна будет изменять значения переменных в вызывающей программе. Вторая форма вызова уже применялась при обращении к функции scanf( ). Когда мы хотим ввести некоторое значение в переменную num, мы пишем scanf("%d, &num). Данная функция читает величину, затем, используя адрес, который ей дается, помещает эту величину в память.
Указатели позволяют обойти тот факт, что переменные функции interchange( ) являются локальными. Они дают возможность нашей функции "добраться" до функции main( ) и изменить величины описанных в ней объектов.
Программисты, работающие на языке Паскаль, могут заметить, что первая форма вызова аналогична обращению с параметром-значением, а вторая - с параметром-переменной. У программистов, пишущих на языке Бейсик, понимание всей этой методики может вызвать некоторые затруднения. В этом случае если материал данного раздела покажется вам поначалу весьма не обычным, не сомневайтесь, что благодаря некоторой практике, все обсуждаемые средства станут простыми, естественными и удобными.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Пример: использование базовых указателей
Пример: использование базовых указателей Рассмотренные выше примеры относились к сортировке файлов в различных ситуациях. Вместе с тем, должно быть очевидным, что наша цель состояла не в обсуждении методик сортировки, а в демонстрации применения различных методов
Различия между функциями wait и waitpid
Различия между функциями wait и waitpid Теперь мы проиллюстрируем разницу между функциями wait и waitpid, используемыми для сброса завершенных дочерних процессов. Для этого мы изменим код нашего клиента TCP так, как показано в листинге 5.7. Клиент устанавливает пять соединений с
Глава 10 Работа с формулами и функциями
Глава 10 Работа с формулами и функциями Программа Excel предоставляет широкие возможности для использования формул. Как уже упоминалось в прошлой главе, формулы – это выражения, состоящие из числовых величин, адресов ячеек и функций, соединенных знаками арифметических
87. Делайте предикаты чистыми функциями
87. Делайте предикаты чистыми функциями РезюмеПредикат представляет собой функциональный объект, который возвращает ответ да/нет, обычно в виде значения типа bool. Функция является "чистой" в математическом смысле, если ее результат зависит только от ее аргументов
Совет 7. При использовании контейнеров указателей, для которых вызывался оператор new, не забудьте вызвать delete для указателей перед уничтожением контейнера
Совет 7. При использовании контейнеров указателей, для которых вызывался оператор new, не забудьте вызвать delete для указателей перед уничтожением контейнера Контейнеры STL отличаются умом и сообразительностью. Они поддерживают итераторы для перебора как в прямом, так и в
4.5.6. Функции, которые проверяют пространственные связи между конфигурациями
4.5.6. Функции, которые проверяют пространственные связи между конфигурациями Спецификация OpenGIS определяет следующие функции. Они проверяют связь между двумя значениями геометрии g1 и g2.В настоящее время MySQL не выполняет эти функции согласно спецификации. Которые
9. Как правильно пользоваться функциями
9. Как правильно пользоваться функциями ФУНКЦИИСТРОИТЕЛЬНЫЕ БЛОКИ ПРОГРАММЫСВЯЗЬ МЕЖДУ ФУНКЦИЯМИ: АРГУМЕНТЫ, УКАЗАТЕЛИ, ВОЗВРАТ ЗНАЧЕНИЯТИПЫ
ИСПОЛЬЗОВАНИЕ УКАЗАТЕЛЕЙ ПРИ РАБОТЕ С МАССИВАМИ
ИСПОЛЬЗОВАНИЕ УКАЗАТЕЛЕЙ ПРИ РАБОТЕ С МАССИВАМИ Попробуем написать функцию, использующую массивы, а затем перепишем ее, применяя указатели. Рассмотрим простую функцию, которая находит (или пытается найти) среднее значение массива целых чисел. На входе функции
Б.4. Взаимосвязь с библиотечными функциями ввода-вывода
Б.4. Взаимосвязь с библиотечными функциями ввода-вывода Выше уже говорилось о том. что функции ввода-вывода стандартной библиотеки языка С реализованы на основе низкоуровневых функций. Иногда удобнее работать с одними, иногда — с другими.Если файл был открыт с помощью
22.1. Сложные функции и сложности с функциями
22.1. Сложные функции и сложности с функциями Функции могут принимать входные аргументы и возвращать код завершения.function_name $arg1 $arg2Доступ к входным аргументам, в функциях, производится посредством позиционных параметров, т.е. $1, $2 и так
Видеоплаты с функциями видеозахвата
Видеоплаты с функциями видеозахвата Некоторые фирмы, производящие видеоплаты (например, фирма Matrox), создали свои модули захвата кадров, работающие только с данным видеоадаптером. Несколько лет назад такое решение было довольно распространенным, однако сейчас подобные
У18.1 Эмуляция перечислимых типов однократными функциями
У18.1 Эмуляция перечислимых типов однократными функциями Покажите, что при отсутствии unique-типов перечислимый тип языка Pascaltype ERROR = (Normal, Open_error, Read_error)может быть представлен классом с однократной функцией для каждого значения
6.2.7. Работаем с функциями
6.2.7. Работаем с функциями Для выполнения задания нам понадобится материал разд. 5.2.7.Задание? Создать таблицу, как показано на рис. 6.34.? В ячейки диапазона F6: F13 записать формулы для подсчета суммы набранных баллов.? В ячейки G6:G13 внести формулы для отображения отметок о
Связи между таблицами
Связи между таблицами Современные базы данных обычно состоят из многих таблиц, связанных между собой. В реляционной теории баз данных выделяют несколько типов связей между таблицами, однако чаще всего используется тип связи «один-ко-многим». Например, в базе данных