Передача параметра

Передача параметра

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

#include<iostream>
using namespace std; // для использования cout
 
void f(int x)
{
    // передача параметра по значению
    cout << x;
    x = 1;
    cout << x;
}
 
void g(int* x)
{ 
    // передача параметра по адресу
    cout << *x;
    *x = 2;
    cout << *x;
}
 
void h(int& x)
{ 
    // передача параметра по ссылке
    cout << x;
    x = 3;
    cout << x;
}
 
void i(const int& x)
{ 
    // передача неизменяемого параметра по ссылке
    cout << x;
    x = 4; //Ошибка
    cout << x;
}
 
int main()
{
    int x = 0;    
    cout << x;
    f(x);
    cout<< x << " ";
    g(&x);
    cout << x << " ";
    h(x);
    cout << x << " ";
    i(x);
    cout << x;
    return 0;
}

Содержание

Передача параметра по значению

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

Передача параметра по адресу

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

Можно заметить, что передача параметра по адресу является частным случаем передачи по значению: передаваемым значением является адрес, по которому можно найти другое значение — значение переменной x.

Передача параметра по ссылке

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

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

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

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

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

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

См. также

Ссылка (программирование)

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Передача параметра" в других словарях:

  • передача параметра — — [http://www.iks media.ru/glossary/index.html?glossid=2400324] Тематики электросвязь, основные понятия EN parameter passing …   Справочник технического переводчика

  • Передача параметра (программирование) — Передача параметра возможна по значению и по ссылке. Иногда также используют выражение передача параметра по адресу . Ниже приведён пример, иллюстрирующий различия этих способов. #include<iostream> using namespace std; // для использования… …   Википедия

  • ГОСТ 17657-79: Передача данных. Термины и определения — Терминология ГОСТ 17657 79: Передача данных. Термины и определения оригинал документа: 78. n кратная ошибка в цифровом сигнале данных n кратная ошибка Е. n fold error Группа из и ошибок в цифровом сигнале данных, при которой ошибочные единичные… …   Словарь-справочник терминов нормативно-технической документации

  • ИНФОРМАЦИИ ПЕРЕДАЧА — составная часть информации теории, относящаяся к изучению процесса переноса информации от источника сообщений к получателю сообщений (адресату). В теории И. п. изучаются оптимальные и близкие к оптимальным методы И. п. по каналам связи в… …   Математическая энциклопедия

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

  • Ссылка (программирование) — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете …   Википедия

  • LIFO — У этого термина существуют и другие значения, см. FIFO и LIFO. Самый верхний элемент стека, который добавлен последним, извлекается самым первым. Поэтому такой стек является структурой типа LIFO LIFO (акроним Last In, First Out, «по …   Википедия

  • LIFO (информатика) — У этого термина существуют и другие значения, см. LIFO. Самый верхний элемент стека, который добавлен последним, извлекается самым первым. Поэтому такой стек является структурой типа LIFO. LIFO акроним Last In, First Out («последним пришёл первым …   Википедия

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

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


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»