- Способы передачи параметров. Виды параметров
- Параметры-значения
- Параметры-переменные
- Параметры-константы
- Способы передачи параметров функциям
- Способы передачи параметров в подпрограммы
- Передача параметров в функцию по значению. Параметры функции. Передача аргументов в функцию. #34
- Задачи по Python с решениями
- Свежие записи
- Виды параметров и способы их передачи
Способы передачи параметров. Виды параметров
Список формальных параметров подпрограммы может состоять из параметров-значений, параметров-переменных и параметров-констант, описанных в произвольном порядке.
В языке Pascal реализовано два способа передачи параметров:
передача по значению для передачи параметров-значений;
передача по ссылке для передачи параметров-переменных и параметров-констант.
Параметры-значения
Описание формальных параметров-значений: (имя1, имя2, …: имя_типа); Например, function Sum(x,y : integer)
В качестве фактического параметра можно использовать только выражение (в частности, переменную или константу), тип значения которого должен быть совместим по присваиванию с типом формального параметра.
Передача фактического параметра состоит в том, что выражение вычисляется перед вызовом подпрограммы, его значение преобразуется, если необходимо, к типу соответствующего формального параметра и присваивается формальному параметру. Даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана копия значения переменной или константы.
Подпрограмма может изменять полученное значение фактического параметра, и это никак не отражается на значениях переменных, входящих в выражение фактического параметра.
Формальный параметр-значение используется для передачи в подпрограмму значений выражений.
Параметры-переменные
Описание формальных параметров-переменных имеет ключевое слово var: (var имя1, имя2, …: имя_типа);
Фактическим параметром может быть только переменная, тип которой эквивалентен типу формального параметра.
В подпрограмму передается адрес фактического параметра.
Все действия с формальным параметром при выполнении подпрограммы производятся с переменной, которая является фактическим параметром. Изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе.
Формальный параметр-переменная используется, когда этот параметр является результатом работы подпрограммы.
Параметры-константы
Описание формальных параметров-констант имеет ключевое слово const: (const имя1, имя2, …: имя_типа);
Фактическим параметром может быть переменная или константа, тип которой эквивалентен типу формального параметра.
В подпрограмму передается адрес фактического параметра.
Подпрограмма может брать значение по этому адресу, но присвоить значение по этому адресу не может. Например, в подпрограмме может быть оператор w:=имя1, но не может быть оператора имя1:=выражение.
Формальный параметр-константа используется, когда передается параметр, занимающий много памяти (например, массив, текстовая строка), но подпрограмма не должна изменять значение параметра.
Описание формального параметра в заголовке подпрограммы
var имя : имя_типа
const имя :имя_типа
выражение, в частности, переменная или константа
переменная или константа
Что передается в подпрограмму
адрес переменной или константы
Возможность изменить фактический параметр при работе подпрограммы
Изменяется, если в подпрограмме есть оператор присваивания имя:=выражение или оператор ввода read(имя). В этих случаях изменяется значение фактического параметра
Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.
Источник
Способы передачи параметров функциям
Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. В операторе вызова функции записывают аргументы функции, а в заголовке описания функции перечисляют параметры.
В С++ передача параметров осуществляется тремя способами:
· по копии (или по значению);
· по адресу (или через указатель);
Это определяется видом объявления параметра в заголовке функции.
Рассмотрим все три способа передачи на примере функции обмена Change(). Ей передаются два параметра, и она должна поменять местами их значения.
1. Передача по копии (по значению):
При передаче по значению объявление параметра похоже на объявление переменной: Тип ИмяПараметра. Такой параметр считается отдельной локальной переменной в теле функции. Ни в заголовке, ни в теле функции не должно быть других параметров или переменных с таким же именем.
Опишем работу программы. В области видимости функции main() существуют две локальные переменные A и B, которые проинициализированы значениями 10 и 20. В момент вызова функции Change() в стеке создаются параметры X и Y, которые получают копии значений аргументов A и B, а также переменная temp. Затем с помощью этой переменной происходит перестановка значений параметров X и Y (прежние значения выделены красным цветом). Однако по окончании работы функции Change() переменные X, Y и temp уничтожаются, поскольку являются локальными переменными, а значения аргументов A и B остаются неизменными.
Таким образом, функция Change() не решает поставленной перед ней задачи. Тем не менее, данный пример иллюстрирует особенность использования параметров-копий: никакие изменения значения параметра внутри функции не отражаются на значении переменной-аргумента, так как параметр является локальной переменной. Это способ передачи параметров в C++ используется по умолчанию.
2. Передача по адресу (через указатель):
Способ передачи параметров по адресу используется для того, чтобы через указатели обеспечить непосредственный доступ к значениям аргументов. В момент вызова функции Change() в стеке создаются параметры-указатели X и Y, которые получают копии адресов аргументов A и B. Теперь параметры X и Y указывают на аргументы A и B. Несмотря на то, что функции Change() не известны имена аргументов A и B, ей известны их адреса, поэтому она имеет доступ к их значениям. С помощью переменной temp происходит перестановка значений аргументов A и B (прежние значения выделены красным цветом). По окончании работы функции Change() переменные X, Y и temp уничтожаются, поскольку являются локальными переменными, но аргументы A и B остаются с новыми значениями. Таким образом, функция выполнила поставленную задачу.
3. Передача по ссылке:
Этот способ передачи параметров появился в C++ для того, чтобы упростить работу с указателями. При передаче по ссылке объявление параметра представляет собой объявление ссылки без инициализации: Тип &ИмяПараметра. Параметр-ссылка локальна в функции: ни в заголовке, ни в ее теле не должно быть объявлено других параметров и переменных с таким же именем. Инициализация параметра-ссылки выполняется во время вызова функции.
В самом простом случае при вызове функции в качестве аргумента задается имя переменной. Тип переменной-аргумента должен совпадать с типом параметра-ссылки. Ссылка становится альтернативным именем аргумента, поэтому любые действия, выполняемые со ссылкой в теле функции, мгновенно отражаются на состоянии аргумента.
В момент вызова функции Change() у аргументов A и B появляются вторые имена X и Y. Поэтому функция Change фактически напрямую работает с исходными переменными A и B и изменяет их.
Использование параметров-ссылок вместо передачи по значению или по адресу более эффективно, поскольку:
1) не требуется памяти для копирования аргументов в локальные переменные;
2) не требуется времени на их создание и уничтожение.
Поэтому программы с параметрами-ссылками работают быстрее и используют меньше памяти. Это имеет значение при передаче структур данных большого объема.
Передача параметра по ссылке также используется, если функция должна возвратить не один результат, а несколько.
Если требуется запретить изменение параметра, передаваемого по адресу или по ссылке, то используется модификатор const, например:
int Func( int a, const double &b);
СОВЕТ Рекомендуется указывать const перед всеми параметрами, изменение которых в функции не предусмотрено. Это облегчает отладку. Кроме того, на место параметра типа const& может передаваться константа.
Параметры, передаваемые в функцию, могут быть любого типа (например, вещественного, структурой, перечислением, объединением, указателем), кроме массива или функции, которые передаются с помощью указателей.
Источник
Способы передачи параметров в подпрограммы
Существует два способа передачи параметров в подпрограммы – передача по значению и передача по наименованию. Способ передачи указывается при объявлении параметра в списке формальных параметров.
По умолчанию предполагается, что параметры обычных типов, например, Real, Integer, String, передаются по значению, а параметры таких типов как визуальные компоненты, динамические массивы передаются по наименованию. Если возникает необходимость явно указать, что параметр передается по наименованию, то перед именем параметра, или перечнем имен одного типа, пишется слово var.
3.1.2.1 Передача параметров по значению
Передача параметров по значению предполагает, что при вызове подпрограммы в памяти будет выделена специальная область для записи копий значений фактических параметров, с которыми и будет работать подпрограмма.
Такой способ передачи защищает переменные, передаваемые в подпрограмму в качестве параметров, от непредусмотренного изменения, так как подпрограмма работает с копиями. Кроме того, такой способ позволяет в качестве фактических параметров задавать выражения. При передаче параметров будет вычислено значение этого выражения и передано в подпрограмму.
Недостаток такого способа передачи состоит в том, что при передаче параметров, требующих много памяти, например, большие массивы чисел или длинные строки, копии занимают много места в памяти и требуется много времени для пересылки данных из одного места памяти в другое.
3.1.2.2 Передача параметров по наименованию
При передаче параметров по наименованию в подпрограмму передаются адреса фактических параметров. Поэтому такой способ передачи называется еще передачей параметров по адресу или по ссылке.
При таком способе передачи в качестве фактических параметров можно передавать только переменные. Выражение и даже отдельное число или символ передать по наименованию нельзя.
Передача параметров по наименованию экономит память и сокращает время обращения к подпрограммам. Однако это имеет и побочный эффект. Так как подпрограмма работает непосредственно с фактическими параметрами, то любое изменение формального параметра является изменением фактического параметра. Для исключения такого эффекта нужно в объявлении формальных параметров вместо слова var использовать слово const.
Но побочный эффект имеет и положительную сторону. Передачу параметров по наименованию можно использовать для возвращения результатов работы подпрограммы через фактические параметры. Такой способ возвращения особенно эффективен, когда требуется вернуть несколько параметров. Ведь функция возвращает только одно значение.
Выше, в пункте 3.1.1 уже рассматривался пример процедуры с передачей параметра по наименованию.
Рассмотрим еще один пример использования передачи параметров по наименованию для возвращения результатов работы подпрограммы.
В создаваемом ниже приложении для расчетов по формуле используется процедура считывания коэффициентов уравнения. Исходный текст этой процедуры приведен ниже.
ProceduregetKoef (var kA, kB, kC:Real);
В этой процедуре содержимое текстовых полей преобразуется в вещественные числа, и результаты преобразования присваиваются формальным параметрам, которые объявлены как передаваемые по наименованию. На это указывает слово varперед именами параметров.
Обращение к этой процедуре происходит в другой процедуре, которая обрабатывает событие onClick кнопки «Расчет по формуле». Фрагмент этой процедуры приведен ниже.
До вызова процедуры значения переменных a, b, c были неопределенными (мусор). При вызове процедуры getKoef адреса этих переменных были переданы в качестве фактических параметров. При выполнении процедуры, по этим адресам были записаны результаты преобразования данных. В результате, после окончания работы процедуры getKoef переменные a, b, c приобрели новые значения, которые были вычислены в процедуре
procedure TfrmSubroutine.btnCalculateRootsClick(Sender: TObject);
// До вызова процедуры getKoefKvUr
// значения переменных a,b,c не определены
//После вызова процедуры значения переменных
// a,b,c соответствуют содержиммому тектовых полей
Передача параметров в функцию по значению. Параметры функции. Передача аргументов в функцию. #34
Источник
Задачи по Python с решениями
Свежие записи
Виды параметров и способы их передачи
На этом шаге мы рассмотрим способы передачи параметров.
При активизации процедуры/функции ей можно передавать параметры. При передаче необходимо следить, чтобы в операторе вызова были указаны все параметры, описанные в заголовке процедуры/функции.
Параметры, указываемые в заголовке процедуры/функции при ее описании, называются формальными параметрами.
Параметры, указываемые при вызове процедуры/функции, называются фактическими параметрами.
Корректность передачи параметров основывается на соответствии их количества и порядка перечисления в заголовке процедуры/функции и в операторе вызова, а также на совместимости по присваиванию между соответствующими фактическими и формальными параметрами.
Область видимости имен параметров такая же, как и локальных данных.
Многие процедуры имеют несколько.параметров. Задача программиста — убедиться, что параметры, которые он указывает при вызове (фактические параметры),
соответствуют по смыслу формальным параметрам. Компилятор может проверить только очевидные случаи — неправильное число параметров или несовместимость типов.
Рассмотрим классификацию способов передачи параметров, реализация которых возможна в языках программирования.
Замечание.
Обращаем внимание, что это общая классификация, а не классификация параметров в Object Pascal. Введенные для
классификации обозначения value, addr, in, out, inout, в Object Pascal не используются.
- передача по значению (value);
- передача по адресу (по ссылке) (addr);
- только как входной параметр (in);
- только как выходной параметр (out);
- как входной, так и как выходной параметр (inout).
Соответственно этим различиям теоретически возможны 6 способов передачи параметров:
Несмотря на то, что возможны шесть способов передачи параметров в существующих языках программирования, как правило, используется не более двух-трех способов.
В Object Pascal реализованы первый (value in), четвертый (addr in) и шестой (addr inout) способы передачи параметров.
Параметры вида value in называются параметрами-значениями, параметры addr inout — параметрами-переменными (ссылками), а параметры addr in — параметрами-константами.
Две разновидности параметров (параметры-значения и параметры-переменные (ссылки)) являются стандартными для всех реализаций и версий языка Pascal.
Третья разновидность (параметры-константы) была введена в последней версии предшественника языка Object Pascal — языке Borland Pascal 7.0.
Со следующего шага мы начнем знакомиться с каждым из перечисленных способов передачи параметров.
Источник