- •Управление esc – последовательность (с примерами)
- •4. Определение констант и их характеристика (const,define,enum)
- •5. Форматные потоки в с. Функции fPrintf(), Fscanf(), и модификации (с примерами). Спецификаторы
- •7. Перегруженные операции.
- •8. Инструкция ветвления. (пример)
- •9. Инструкция switch()
- •10. Применение инструкции switch() для создания текстового меню.
- •11. Инструкция цикла.
- •12. Инструкция перехода.
- •13. Указатели. Операции над указателями. Косвенная адресация.
- •14. Ссылки (пример)
- •15. Статические числовые одномерные
- •16. Статические числовые двумерные массивы.
- •17. Динамическая память.
- •18. Выделение памяти под динамический одномерный и двумерный массив.
- •19. Алгоритм удаления и добавления данных в массив.
- •20. Глобальные, локальные, статические, внешние переменные.
- •21. Классы памяти.
- •22. Формальные и фактические параметры.
- •23. Функции.
- •24. Виды передачи параметров в функцию.
- •25.Функции и массивы
- •26. Функции с переменным числом параметров.
- •27. Шаблоны функции.
- •28.Рекурсии. Фреймы.
- •29. Функция Main()
- •30. Стеки.
- •31. Очереди.
- •33. Строки, как массив символов.
- •34. Функции ввода строковых переменных.
- •35.Основные функции обработки строковых переменных.
- •37. Функции преобразования типов.
- •38. Строки типа string.
- •40. Функции работы с памятью. Memcmp - сравнивает две области памяти
- •41. Структуры
- •42. Вложенные структуры.
- •43. Объединения (union)
- •44.Передача переменных определенных пользователем в функцию.
- •50. Функция определения конца файла.
- •51. Файловый поток.
- •52. Функции tellg и ftell
- •53. Установка файлового указателя
- •55. Обработка текстовых файлов.
- •56. Бинарный файл.
24. Виды передачи параметров в функцию.
В С++ передача параметров осуществляется двумя способами: по значению и по ссылке. Это определяется видом объявления параметра в заголовке функции .
При передаче по значению объявление параметра похоже на объявление переменной:
тип имя
Такой параметр считается отдельной локальной переменной в теле функции . Ни в заголовке, ни в теле функции не должно быть других параметров или переменных с таким же именем. При вызове функции для параметров, передаваемых по значению, неявно выполняется операция присваивания:
параметр = выражение
Выражение вычисляется; если тип полученного значения не соответствует типу параметра , то выполняется (если это возможно) преобразование типов, и значение присваивается параметру . В частности, если в качестве аргумента задана константа или переменная, совпадающая по типу с параметром , то значение просто копируется в параметр . Копирование требует времени, поэтому способ передачи параметров по значению обычно применяется для данных встроенных типов, время копирования которых мало.
Никакие изменения значения параметра внутри функции не отражаются на значении переменной-аргумента, так как параметр является локальной переменной.
При передаче по ссылке объявление параметра представляет собой объявление ссылки без инициализации:
тип &имя
Параметр-ссылка локальна в функции : ни в заголовке, ни в ее теле не должно быть объявлено других параметров и переменных с таким же именем. Инициализация параметра-ссылки выполняется во время вызова функции . При этом способе передачи параметров в качестве аргумента может задаваться только L-значение.
В самом простом варианте на месте аргумента, соответствующего параметру-ссылке , задается имя переменной. Тип переменной-аргумента должен совпадать с типом параметра-ссылки . Ссылка становится альтернативным именем аргумента, поэтому любые действия, выполняемые со ссылкой в теле функции , мгновенно отражаются на состоянии аргумента.
Этот способ передачи параметра используется, если функция должна возвратить не один результат, а несколько. Например, передача параметров по ссылке может использоваться в функции обмена значений двух переменных:
void swap( int &a, int &b ) // определение функции обмена
{ int t = a; a = b; b = t; }// ...
int x = 5, y = 6;
swap( x, y ); // вызов функции обмена
Пример передачи параметров :
#include <iostream>
using namespace std;
void f(int i, int* j, int& k);
int main()
{int i = 1, j = 2, k = 3;
cout <<"i j k\n";
cout << i <<' ' << j <<' '<< k <<'\n'; f(i, &j, k);
cout << i <<' '<< j <<' '<< k;}
void f(int i, int* j, int& k)
{ i++; (*j)++; k++; }
Результат работы программы:
i j k
1 2 3
1 3 4
Первый параметр (i) передается по значению. Его изменение в функции не влияет на исходное значение. Второй параметр (j) передается по адресу с помощью указателя, при этом для передачи в функцию адреса фактического параметра используется операция взятия адреса, а для получения его значения в функции требуется операция разыменования. Третий параметр (k) передается по адресу с помощью ссылки.