Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Параметры по умолчанию

Иногда в общем объявлении функции описывается больше параметров, чем в требуется в некотором частном случае при ее вызове. Например, если мы хотим в некоторой функции выделять память для динамического размещения в ней числового массива, то наряду с размерностью выделяемой памяти (первый параметр) в функцию можно передавать и некоторый инициализатор(второй, необязательный параметр). Однако если мы его не хотим явно передавать ему может быть присвоено некоторое значение по умолчанию. Чтобы избежать засорения программы вызовами вроде memory(k,0), функция описывается так:

void* memory(long, int =0);

Инициализатор второго параметра является параметром по умолчанию. То есть, если в вызове дан только один параметр, в качестве второго используется параметр по умолчанию. Например:

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

int f(int, int =0, char* =0); // верно

int g(int =0, int =0, char*); // ошибка

int h(int =0, int, char* =0); // ошибка

Отметим, что пробел между * и = является существенным (*= является операцией присваивания):

int f(char*=0); // синтаксическая ошибка

Передача массива в функцию

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

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

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

#include <stdio.h>

int max(int ms[10]) // прототип функции fun

{ int k=ms[0];

for(int i=1; i<10; i++)

if(k<ms[i]) k=ms[i];

return k;

}

main()

{ int mas[3][4], i, j;

for(i=0; i<3; i++)

{ for(j=0; j<4; j++) scanf( ”%d”&mas[i][j]);

printf(“\nмаксимальное значение в строке %d =%d”, i,fun(mas[i]));

}

}

В этом случае выполняется преобразование mas[i] к указателю на целый тип, и в функцию передается адрес mas[i][0]. В функции находится максимальное значение каждой строки и выводится на экран.

2. Массив в качестве параметра в функции может быть объявлен без указания его размера. Так как сам массив в стек не копируется, то размер массив в общем случае компилятору не требуется.

int max(int ms[]) // прототип функции fun

{ // тело функции аналогично опмсанному выше

}

3. Наиболее распространенный способ – объявление параметра-массива указателем на соответствующий тип данных. Функцию можно описать следующим образом:

int max(int *ms)

{ // тело функции аналогично опмсанному выше

}

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

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