Параметр (программирование)

Поделись знанием:
(перенаправлено с «Передача по ссылке»)
Перейти к: навигация, поиск

Пара́метр в программировании — принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр — в каком качестве функция применила это принятое. То есть вызывающий код передает аргумент в параметр, который определен в члене спецификации функции.





Формальные и фактические параметры

Важно различать:

  • формальный параметр — аргумент, указываемый при объявлении или определении функции.[1][2]
  • фактический параметр — аргумент, передаваемый в функцию при её вызове;

Пример на языке Си:

// Описание функции. int a - формальный параметр, имя параметра может отсутствовать.
int myfunction(int a);

// Определение функции. int b - формальный параметр, имя параметра может не совпадать с указанным при объявлении функции.
int myfunction(int b) 
{
   return 0;
}

int main()
{
    int c=0;
    myfunction(c); // Вызов функции. c - фактический параметр.
    return 0;
}

Использование параметров

Семантика использования формальных и фактических параметров называется стратегией вычисления. Заданная стратегия вычисления диктует, когда следует вычислять аргументы функции (метода, операции, отношения), и какие значения следует передавать. Существует довольно много разнообразных стратегий вычисления.

Примечание — использование распространённого в сообществе императивного программирования термина «передача параметра» для многих языков программирования является не вполне корректным — например, в случае вызова по необходимости, применяемого в языке Haskell, параметр может быть использован в теле функции, но ни разу не передан за все случаи её вызова, и даже полностью исключён из результирующего машинного кода.

Наиболее часто упоминаемыми стратегиями вычисления являются вызов по значению и вызов по ссылке, однако в действительности использование этих терминов не всегда уместно. Например, в сообществе языка Java говорят «Java использует вызов по значению, где „значением“ является ссылка на объект», в сообществе языка Ruby говорят «Ruby использует вызов по ссылке», однако в действительности оба эти языка используют стратегию вызов по соиспользованию (англ. call-by-sharing)[3][4]. Многие языки, например Си, не имеют механизма вызова по ссылке, но позволяют симулировать его внутри семантики вызова по значению посредством ссылочных типов, в частности, указателей. В последнем случае в сообществах таких языков часто говорят «язык поддерживает две стратегии вычисления», а также о «вызове по указателю» или «вызове по адресу».

На практике, модель вычисления многих промышленных языков (Java, C#) сводится к стратегии «вызов-при-упоминании/передача-по-ссылке». Некоторые более старые языки, в особенности небезопасные языки, такие как C++, сочетают несколько разных моделей вызова, включая экзотичные, такие как «вызов-по-ссылке-на-константу». Исторически вызов по значению и вызов по имени восходят к Алголу-60, созданному в конце 1950-х годов. Только чистые функциональные языки, такие как Clean и Haskell, используют вызов по необходимости (англ. call-by-need), который часто отождествляют (что также не вполне корректно) с ленивыми вычислениями.

Примеры

Передача параметра по ссылке означает что копируется не само значение, а адрес исходной переменной (как в случае передачи параметра по адресу), однако синтаксис используется такой, чтобы программисту не приходилось использовать операцию разыменования и он мог иметь дело непосредственно со значением, хранящимся по этому адресу (как в случае передачи параметра по значению).

Передача по ссылке позволяет избежать копирования всей информации, описывающей состояние объекта (а это может быть существенно больше чем sizeof(int)) и является необходимой для конструктора копирования.

Если функция возвращает значение по ссылке (например, в виде «return *this;»), то её вызов можно использовать слева от оператора присваивания (смотри также L-выражение).

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


Таким образом можно ожидать, что примерная программа напечатает (если закомментировать ошибочную строку) «0010 022 233 333».

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

Язык Fortran подразумевает передачу параметров исключительно по ссылке:

См. также

Напишите отзыв о статье "Параметр (программирование)"

Литература

  • В.В.Фаронов. 8.2.2. Параметры // 8.2. Описание подпрограммы // Глава 8. Процедуры и функции // [borlpasc.narod.ru/docym/Faronov/gl8/gl8_3.html Иллюстрированный самоучитель по Турбо Паскалю].

Ссылки

  1. [crasseux.com/books/ctutorial/Actual-parameters-and-formal-parameters.html The GNU C Programming - Actual parameters and formal parameters] (англ.).
  2. [citforum.ru/programming/c/h15.shtml Определение и вызов функций].
  3. Fredrik Lundh. [effbot.org/zone/call-by-object.htm Call By Object] ( (англ.)). effbot.org.
  4. [www.cs.cornell.edu/courses/cs412/2001sp/iota/iota.html Iota Language Definition]. CS 412/413 Introduction to Compilers. Cornell University (2001).


Отрывок, характеризующий Параметр (программирование)

– Душой рада, что приехали и что у меня остановились, – говорила она. – Давно пора, – сказала она, значительно взглянув на Наташу… – старик здесь и сына ждут со дня на день. Надо, надо с ним познакомиться. Ну да об этом после поговорим, – прибавила она, оглянув Соню взглядом, показывавшим, что она при ней не желает говорить об этом. – Теперь слушай, – обратилась она к графу, – завтра что же тебе надо? За кем пошлешь? Шиншина? – она загнула один палец; – плаксу Анну Михайловну? – два. Она здесь с сыном. Женится сын то! Потом Безухова чтоль? И он здесь с женой. Он от нее убежал, а она за ним прискакала. Он обедал у меня в середу. Ну, а их – она указала на барышень – завтра свожу к Иверской, а потом и к Обер Шельме заедем. Ведь, небось, всё новое делать будете? С меня не берите, нынче рукава, вот что! Намедни княжна Ирина Васильевна молодая ко мне приехала: страх глядеть, точно два боченка на руки надела. Ведь нынче, что день – новая мода. Да у тебя то у самого какие дела? – обратилась она строго к графу.
– Всё вдруг подошло, – отвечал граф. – Тряпки покупать, а тут еще покупатель на подмосковную и на дом. Уж ежели милость ваша будет, я времечко выберу, съезжу в Маринское на денек, вам девчат моих прикину.
– Хорошо, хорошо, у меня целы будут. У меня как в Опекунском совете. Я их и вывезу куда надо, и побраню, и поласкаю, – сказала Марья Дмитриевна, дотрогиваясь большой рукой до щеки любимицы и крестницы своей Наташи.
На другой день утром Марья Дмитриевна свозила барышень к Иверской и к m me Обер Шальме, которая так боялась Марьи Дмитриевны, что всегда в убыток уступала ей наряды, только бы поскорее выжить ее от себя. Марья Дмитриевна заказала почти всё приданое. Вернувшись она выгнала всех кроме Наташи из комнаты и подозвала свою любимицу к своему креслу.
– Ну теперь поговорим. Поздравляю тебя с женишком. Подцепила молодца! Я рада за тебя; и его с таких лет знаю (она указала на аршин от земли). – Наташа радостно краснела. – Я его люблю и всю семью его. Теперь слушай. Ты ведь знаешь, старик князь Николай очень не желал, чтоб сын женился. Нравный старик! Оно, разумеется, князь Андрей не дитя, и без него обойдется, да против воли в семью входить нехорошо. Надо мирно, любовно. Ты умница, сумеешь обойтись как надо. Ты добренько и умненько обойдись. Вот всё и хорошо будет.
Наташа молчала, как думала Марья Дмитриевна от застенчивости, но в сущности Наташе было неприятно, что вмешивались в ее дело любви князя Андрея, которое представлялось ей таким особенным от всех людских дел, что никто, по ее понятиям, не мог понимать его. Она любила и знала одного князя Андрея, он любил ее и должен был приехать на днях и взять ее. Больше ей ничего не нужно было.
– Ты видишь ли, я его давно знаю, и Машеньку, твою золовку, люблю. Золовки – колотовки, ну а уж эта мухи не обидит. Она меня просила ее с тобой свести. Ты завтра с отцом к ней поедешь, да приласкайся хорошенько: ты моложе ее. Как твой то приедет, а уж ты и с сестрой и с отцом знакома, и тебя полюбили. Так или нет? Ведь лучше будет?
– Лучше, – неохотно отвечала Наташа.


На другой день, по совету Марьи Дмитриевны, граф Илья Андреич поехал с Наташей к князю Николаю Андреичу. Граф с невеселым духом собирался на этот визит: в душе ему было страшно. Последнее свидание во время ополчения, когда граф в ответ на свое приглашение к обеду выслушал горячий выговор за недоставление людей, было памятно графу Илье Андреичу. Наташа, одевшись в свое лучшее платье, была напротив в самом веселом расположении духа. «Не может быть, чтобы они не полюбили меня, думала она: меня все всегда любили. И я так готова сделать для них всё, что они пожелают, так готова полюбить его – за то, что он отец, а ее за то, что она сестра, что не за что им не полюбить меня!»
Они подъехали к старому, мрачному дому на Вздвиженке и вошли в сени.
– Ну, Господи благослови, – проговорил граф, полу шутя, полу серьезно; но Наташа заметила, что отец ее заторопился, входя в переднюю, и робко, тихо спросил, дома ли князь и княжна. После доклада о их приезде между прислугой князя произошло смятение. Лакей, побежавший докладывать о них, был остановлен другим лакеем в зале и они шептали о чем то. В залу выбежала горничная девушка, и торопливо тоже говорила что то, упоминая о княжне. Наконец один старый, с сердитым видом лакей вышел и доложил Ростовым, что князь принять не может, а княжна просит к себе. Первая навстречу гостям вышла m lle Bourienne. Она особенно учтиво встретила отца с дочерью и проводила их к княжне. Княжна с взволнованным, испуганным и покрытым красными пятнами лицом выбежала, тяжело ступая, навстречу к гостям, и тщетно пытаясь казаться свободной и радушной. Наташа с первого взгляда не понравилась княжне Марье. Она ей показалась слишком нарядной, легкомысленно веселой и тщеславной. Княжна Марья не знала, что прежде, чем она увидала свою будущую невестку, она уже была дурно расположена к ней по невольной зависти к ее красоте, молодости и счастию и по ревности к любви своего брата. Кроме этого непреодолимого чувства антипатии к ней, княжна Марья в эту минуту была взволнована еще тем, что при докладе о приезде Ростовых, князь закричал, что ему их не нужно, что пусть княжна Марья принимает, если хочет, а чтоб к нему их не пускали. Княжна Марья решилась принять Ростовых, но всякую минуту боялась, как бы князь не сделал какую нибудь выходку, так как он казался очень взволнованным приездом Ростовых.
– Ну вот, я вам, княжна милая, привез мою певунью, – сказал граф, расшаркиваясь и беспокойно оглядываясь, как будто он боялся, не взойдет ли старый князь. – Уж как я рад, что вы познакомились… Жаль, жаль, что князь всё нездоров, – и сказав еще несколько общих фраз он встал. – Ежели позволите, княжна, на четверть часика вам прикинуть мою Наташу, я бы съездил, тут два шага, на Собачью Площадку, к Анне Семеновне, и заеду за ней.
Илья Андреич придумал эту дипломатическую хитрость для того, чтобы дать простор будущей золовке объясниться с своей невесткой (как он сказал это после дочери) и еще для того, чтобы избежать возможности встречи с князем, которого он боялся. Он не сказал этого дочери, но Наташа поняла этот страх и беспокойство своего отца и почувствовала себя оскорбленною. Она покраснела за своего отца, еще более рассердилась за то, что покраснела и смелым, вызывающим взглядом, говорившим про то, что она никого не боится, взглянула на княжну. Княжна сказала графу, что очень рада и просит его только пробыть подольше у Анны Семеновны, и Илья Андреич уехал.
M lle Bourienne, несмотря на беспокойные, бросаемые на нее взгляды княжны Марьи, желавшей с глазу на глаз поговорить с Наташей, не выходила из комнаты и держала твердо разговор о московских удовольствиях и театрах. Наташа была оскорблена замешательством, происшедшим в передней, беспокойством своего отца и неестественным тоном княжны, которая – ей казалось – делала милость, принимая ее. И потом всё ей было неприятно. Княжна Марья ей не нравилась. Она казалась ей очень дурной собою, притворной и сухою. Наташа вдруг нравственно съёжилась и приняла невольно такой небрежный тон, который еще более отталкивал от нее княжну Марью. После пяти минут тяжелого, притворного разговора, послышались приближающиеся быстрые шаги в туфлях. Лицо княжны Марьи выразило испуг, дверь комнаты отворилась и вошел князь в белом колпаке и халате.