- •29. Как работать с массивом символов
- •30. Для чего необходимо динамическое распределение памяти
- •31. Использование ссылок
- •32. Функции, их объявление/определение
- •33. Как описывается передача параметров в функциях
- •34. Особенности работы с функциями, где в качестве параметров используется массив
- •35. Сопоставление фактических и формальных параметров
- •57. Ссылки. Понятие и _____
- •58. Глобальные, локальные, статические локальные и внешние переменные
- •59. Функция. Прототип функции и _____
- •61. Возвращаемые значения функции. Способы возвращения значения
- •62. Способы передачи параметров функции. Передача по значению
- •63. Способы передачи параметров. Передача по ссылке
- •64. Параметры ссылки
- •66. Многомерные массивы как параметры
- •67. Параметры функции, заданные по умолчанию
- •68. Функции подстановки
- •69. Перегруженные функции
- •70. Указатель на функцию
- •71. Виды областей видимости
- •72. Подходы к разработке структуры программ
63. Способы передачи параметров. Передача по ссылке
Для реализации передачи по ссылке передименем параметра в заголовке функции должен быть написан ‘&’.
void Function(char &Ch);
В этом случае не происходит копирования значения аргумента в локальную, временную переменную в процедуре. Процедура реально работает не с параметром, а со ссылкой – указателем на место хранения аргумента в памяти. Любые изменения параметра Ch в процедуре, в действительности относятся не к этомупараметру, а к тому аргументу, который был передан при вызове программы.
Передача параметра по ссылке позволяет возвращать информацию из функции в вызывавшую его внешнюю процедуру.
64. Параметры ссылки
<Тип ссылки>&<имя ссылки>;
Тип ссылки определяется спецификацией типа, за которой следует операция &
Примеры
1. int A = 5;
2. int& rA = A;
3. extern int& rB;
4. int& foo ();
5. void bar (int& rP);
65. Способы передачи параметров
Параметры (аргументы) функции, указываемые в списке при определении функции, называются формальными. Параметры, указываемые при вызове функции, называются фактическими.
Способы передачи:
· по значению [в стек заносятся копии значений аргументов; функция работает с копиями]
* значения фактических параметров копируются в память, отведенную для формальных параметров. При этом значения, с которыми работает функция - это ее собственные локальные копии фактических параметров и их изменение на эти параметры не влияет. При окончании функции эти локальные значения теряются. Таким образом, при передаче по значению содержимое фактических параметров не изменяется
· по адресу (ссылке) [в стек заносятся копии адресов аргументов и функция осуществляет доступ к ячейкам памяти по этим адресам. Могут изменяться исходные значения аргументов]
* При передаче параметров по ссылке каждый формальный параметр, который необходимо изменить, описывают с типом ссылка. Поскольку ссылка - это другое имя объекта и все действия, которые производятся над ссылкой, являются действиями над самим объектом, то при передаче параметра-ссылки внутри функции мы имеем дело с самим объектом, а не с его локальной копией. Это означает, что действия, произведенные в функции над формальными параметрами проводят к изменению фактических.
66. Многомерные массивы как параметры
Если в качестве параметра функции указан массив, то передается указатель на его первый элемент. Это означает, что фактический параметр типа T[] преобразуется к типу T*, и затем передается. Поэтому присваивание элементу формального параметра-массива изменяет этот элемент. Массивы отличаются от других типов тем, что они не передаются и не могут передаваться по значению. В вызываемой функции размер передаваемого массива неизвестен. Его нужно передавать отдельно.
Когда параметром является двумерный массив, его вторая размерность обязательно указывается в объявлении функции
float a[ ][4].
Объявление параметра как float a[ ][ ] недопустимо.
Нет ничего странного в том, что компилятору требуется вторая размерность, ведь именно она определяет размер тех одномерных массивов, которые составляют двумерный.
