Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТ...docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
695.51 Кб
Скачать

2. Передача массивов в качестве параметров функций

Чтобы у программ была понятная человеку структура, допускающая

модификацию и повторное использование исходного текста, отдельные

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

для хранения данных часто применяются массивы, то бывают необходимы

и функции для их обработки. Этим функциям массивы можно передавать в

качестве параметров. В показанном ниже фрагменте программы 8.3

содержится определение функции, которая принимает массив типа

"Hours_array" (см. программу 8.1) и возвращает среднее количество часов,

отработанных сотрудниками группы.

float average( Hours_array hrs )

{

float total = 0;

int count;

for ( count = 0; count < NO_OF_EMPLOYEES; count++ )

total += float(hrs[count]);

return ( total/NO_OF_EMPLOYEES );

}

Фрагмент программы 8.3

Эту функцию можно сделать более универсальной, если размер

массива не фиксировать в ее определении, а передать в качестве второго

параметра:

float average( int list[], int length )

{

float total = 0;

int count;

for ( count = 0 ; count < length; count++ )

total += float(list[count]);

return ( total/length );

}

В этом примере показан очень распространенный способ

оформления функций, работающих с массивами: в одном параметре

передается длина массива, а в другом –сам массив, причем в описании

параметра-массива не указывается длина массива (например, "int list[]").

Параметры-массивы всегда передаются по ссылке (а не по

значению), хотя при их описании в заголовке функции символ "&" не

указывается. Правило "массивы всегда передаются по ссылке" введено для

того, чтобы функции не делали собственных внутренних копий переданных

им массивов – для больших массивов это могло бы привести к

нерациональным затратам памяти. Следовательно, как и параметры по

ссылке, рассматривавшиеся в 3-ей лекции, все изменения элементов

параметров-массивов внутри функций будут видны и в вызывающей

функции.

Далее показана функция (фрагмент программы 8.4), принимающая в

качестве параметров три массива. После ее вызова каждый элемент

третьего массива будет равен сумме двух соответствующих элементов

первого и второго массивов.

void add_lists( int first[], int second[], int total[],

int length )

{

int count;

for ( count = 0; count < length; count++ )

total[count] = first[count] + second[count];

}

Фрагмент программы 8.4

В целях безопасности, для защиты от случайного изменения

элементов массива, в описание первых двух параметров функции добавим

модификатор типа "const":

void add_lists( const int fst[], const int snd[], int tot[],

int len )

{

int count;

for ( count = 0; count < len; count++ )

tot[count] = fst[count] + snd[count];

}

Теперь компилятор не будет обрабатывать ни один оператор в

определении функции, который пытается модифицировать элементы

константных массивов "fst" или "snd". Фактически, ограничение,

накладываемое модификатором "const" в данном контексте, в некоторых

ситуациях оказывается слишком строгим. Например, компилятор выдаст

ошибку при обработке следующих двух функций:

void no_effect( const int list[] )

{

do_nothing( list );

}

void do_nothing( int list[] )

{

;

}

Фрагмент программы 8.5

Ошибка компиляции программы 8.5 объясняется тем, что, хотя

фактически функция "do_nothing(...)" не выполняет никаких действий, но в ее

заголовке отсутствует модификатор "const". Когда компилятор в теле

функции "no_effect(...)" встретит вызов функции "do_nothing(...)", то он обратится

только к заголовку функции "do_nothing(...)", и выдаст ошибку о невозможности

передачи константного массива в эту функцию.