Способы передачи параметров в функцию в c

Способы передачи параметров в функцию в c

28. Подпрограммы (процедуры и функции) в языках программирования. Способы передачи параметров в процедурах. Программирование рекурсивных алгоритмов.

Часто в задаче требуется повторить определенную последовательность операторов в разных частях программы.

Подпрограмма — поименованная или автономная часть компьютерной программы, содержащая описание определённого набора действий. Подпрограмма может быть многократно вызвана из разных частей программы.

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

Говоря о положительных моментах подпрограмм, нельзя не упомянуть о минусах данного подхода.

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

В языках программирования высокого уровня используется два типа подпрограмм: процедуры и функции.

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

Процедура — это любая подпрограмма, которая не является функцией.

СПОСОБЫ ПЕРЕДАЧИ ПАРАМЕТРОВ

Формальные параметры – описаны в заголовке и теле

Фактические – передаваемые в продпрограмму

Передача параметров по значению. int func1(int x)

Передача параметров по ссылке C++ void func2(int &x)

C# — это параметры ref и out. При использовании Ref параметр должен быть обязательно инициализирован до вызова, а при out это не требуется.

public static void Test(int a, out int b)

Параметры являются необязательными, когда присутствует в объявлении значение по умолчанию. Например, ниже представлен метод, который принимает два параметра: строковый параметр "category" и целочисленный "pageIndex". Параметр "pageIndex" имеет значение по умолчанию равное 2 и поэтому является необязательным параметром:

Public List GetProducts( string name, int pageCategory = 2);

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

В C# подобная техника называется делегированием.

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

delegate void Del(int x);

Del d = delegate(int k) < /* . */ >;

button1.Click += delegate(System.Object o, System.EventArgs e)

В C++ — Лямбда выражение. Лямбда-выражения в C++ — это краткая форма записи анонимных функторов (Функтор — объект, который можно использовать как функцию.).

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

Читайте также:  Как можно составить кроссворд

В С++ передача параметров осуществляется тремя способами:

· по копии (или по значению);

· по адресу (или через указатель);

Это определяется видом объявления параметра в заголовке функции.

Рассмотрим все три способа передачи на примере функции обмена 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) не требуется памяти для копирования аргументов в локальные переменные;

Читайте также:  Как убрать рамки в компас 3d

2) не требуется времени на их создание и уничтожение.

Поэтому программы с параметрами-ссылками работают быстрее и используют меньше памяти. Это имеет значение при передаче структур данных большого объема.

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

Если требуется запретить изменение параметра, передаваемого по адресу или по ссылке, то используется модификатор const, например:

int Func( int a, const double &b);

СОВЕТ Рекомендуется указывать const перед всеми параметрами, изменение которых в функции не предусмотрено. Это облегчает отладку. Кроме того, на место параметра типа const& может передаваться константа.

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

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8750 — | 7555 — или читать все.

Параметры функции и глобальные переменные

Параметры функции служат для обмена информацией между этой функцией и теми функциями, которые её вызывают. Обычно вызывающая функция должна передать в вызываемую функцию исходные данные, необходимые для работы функции, например, стандартная функция pow возведения числа в степень должна получить в качестве параметров значения числа и степени. Иногда и результаты функции передаются через параметры, или функция изменяет значения параметров – например, функция сортировки массива переставляет местами элементы массива, который передаётся ей как параметр.

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

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

Способы передачи параметров в функцию

Имеется два принципиально различных механизма передачи параметров в функцию:

· передача значения параметра (передача по значению);

· передача адреса ячейки памяти, связанной с параметром (в С++ такой способ можно реализовать двумя способами – через указатели или ссылки).

Передача по значению используется только для передачи входных параметров (исходных данных) в функцию. По умолчанию параметры передаются именно по значению – в примере 1.12 с функцией sqr единственный параметр передаётся по значению.

Обратите внимание — функции передается лишь значение параметра, которое помещается в локальную переменную, специально созданную для этой цели. Таким образом, в функции используется копия параметра. В теле функции эта копия может изменяться, но сам параметр останется без изменения.

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

Читайте также:  Что за программа imovie на айфоне

Адрес параметра передаётся в функцию в том случае, если по логике работы функции этот параметр должен получить или изменить своё значение в теле функции. Адрес можно передать двумя способами – через указатель (используя операцию *) или через ссылку (операция &). Первый способ достался в наследство от языка С, в С++ при реализации функций рекомендуется использовать ссылки.

В этом случае, в отличие от передачи параметра по значению, функция работает непосредственно с ячейкой памяти, в которой размещён параметр, никакой копии не создаётся.

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

// Пример 1.16 – функция меняет местами значения двух переменных

using namespace std;

void change(int &x, int &y)<

cout >a>>b; // ввели два числа

if (a>b) change(a,b); // a всегда будет

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

int func(int a[10])

Для массивов переменного размера сам размер также передаётся как параметр, например:

int func(int a[], int n) <тело функции>// n – размер массива

Рекомендуемый способ основан на связи массивов и указателей, например:

int func(int *a, int n)<тело функции>//имя массива – указатель на него

При передаче двумерного массива также возможны варианты, например:

int func(int a[10][20])

int func(int a[10][], int n)<тело функции>// int a[][] – нельзя!!

Для динамически формируемого двумерного массива в виде массива указателей на массив указателей (см. главу 2) можно использовать такой вариант:

int func(int **a, int n, int m)

Пример передачи массива в функции будет рассмотрен далее (пример 1.15).

Параметры-константы

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

Обычно const используют для параметров, передаваемых по указателю или ссылке. В этом случае использование const — хороший способ передачи исходных данных в функцию (как альтернатива передаче по значению), т. к. при этом не требуется дополнительных затрат памяти для хранения копий параметров. Рекомендуется использовать этот способ для передачи параметров, которые занимают много места в памяти, например, для параметров типа string (например, const string &s), типов на основе vector (например, const vector &x) или других сложных типов.

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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

Ссылка на основную публикацию
Совместимость ssd с ноутбуками
Вопрос совместимости Многие пользователи интересуются совместимостью материнской платы и SSD, который они купили или хотят купить. Опыт показывает, что не...
Скрыть не интересуюсь уже купил спам мешает
"Яндекс" запустил опцию "Скрыть объявление" на сайтах входящих в Рекламную сеть Яндекса. Опция позволяет отключить показ рекламных объявлений, которые в...
Слабо работает интернет что делать
Как настроить роутер, как настроить модем, как настроить оптический терминал. Настройка роутера по http://192.168.1.1 или http://192.168.0.1 Что делать если медленно...
Совместимость ремешков apple watch
Здесь приводятся общие инструкции, которые помогут Вам снять, поменять и застегнуть ремешок. В случае смены ремешка убедитесь, что размеры используемого...
Adblock detector