Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Proga_shpory.docx
Скачиваний:
44
Добавлен:
25.03.2015
Размер:
102.57 Кб
Скачать

35) Соответствие между фактическими и формальными аргументами. Использование указателей в качестве аргументов. Возврат результатов из функции.

Соответствие между формальными и фактическими аргументами

Виды формальных аргументов

Виды фактических аргументов

переменная

переменная, константа, выражение

массив одномерный

массив одномерный

массив двумерный

массив двумерный

указатель:

- на переменную

указатель на переменную, адрес переменной (&)

-на массив одномерный

указатель на массив одномерный или имя одномерного массива

- на двумерный массив

указатель на массив двумерный

-на функцию

указатель на функцию или имя функции

ссылка

переменная

За соответствие между формальными и фактическими аргументами должен следить программист.

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

Вызываемые функции могут передавать одно значение в точку вызова, либо через аргументы-указатели или ссылки.

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

Ссылку в С++ можно понимать или как альтернативное имя объекта, или как безопасный вариант указателей. Ссылки имеют три особенности, отличающие их от указателей.

При объявлении ссылка обязательно инициализируется ссылкой на уже существующий объект данного типа.

Ссылка пожизненно указывает на один и тот же адрес.

При обращении к ссылке операция * производится автоматически.

Объявление ссылок очень похоже на объявление указателей, только вместо звёздочки «*» нужно писать амперсанд «&».

37) Виды функций. Функции с переменным числом аргументов.

Функции с переменным количеством аргументов.

Признаком является наличие в списке функции многоточия

int TT(int a, …);

Примером таких функции – scanf() printf().

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

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

Функции с переменным количеством аргументов должны иметь способ определения точного количества аргументов при каждом вызове:

1) Пересылка в функцию числа аргументов (один из фиксированных аргументов)

2) Задание признака конца списка аргументов.

Копии данных типа char передаются в стек как int, а данные типа float как double.

Для выбора аргументов из списка переменной длины можно использовать 3 способа:

1) void *p использование указателя пустого типа

2) Использования указателей соответствующих типов

3) Использование стандартных макросов для работы со списком переменной длины, которые описаны в заголовочном файле <stdarg.h>:

va_list – определяет переменную, являющуюся указателем для работы со списком

va_start – устанавливает переменную, описанную как va_list на первый аргумент списка переменной длинны. Этот макрос использует 2 аргумента, второй аргумент определяет имя последнего фиксированного аргумента

va_arg – извлекает очередной элемент списка из стека и переустанавливает указатель на следующий элемент списка. В этом макросе можно задать тип аргумента

va_end – завершает обработку списка аргументов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]