Функции, возвращающие массивы

Резюме

Аргументом функции может быть целый массив, и тогда этот аргумент передается осо­бым образом: не по ссылке и не по значению. Такие аргументы называются аргумента­ми типа массива. Когда аргумент типа массива подставляется в параметр типа массива, функция получает единственное значение — адрес первого элемента массива в памяти (то есть элемента массива с индексом 0). Размер массива не передается функции авто­матически, поэтому в ее объявлении обычно определяют дополнительный параметр типа int, в котором явно задается размер массива (как в приведенном ниже примере).

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

Синтаксис

возвращаемый_тип имя_функции (... . базовый_тип_имя_массива[]. ...);

Пример

void sum_array(double& sum, double a[], int size);

Ловушка: несогласованное использование квалификатора const

Квалификатор параметра const действует по принципу «все или ничего». Если он используется для параметра типа массива конкретного типа в одной из функций программы, то должен применяться и во всех остальных функциях программы, имеющих параметр того же типа и не изменяющих его значение. Это связано с ча­сто встречающимися в программах на C++ вызовами одних функций другими. Рассмотрим приведенное ниже определение функции show_diffегеnсе и объявле­ние используемой в нем функции compute_average:

double compute_average(int a[], int number_used):

// Возвращает среднее арифметическое первых number_used

// элементов массива а. Массив а не изменяется.

void show_difference(const int a[], int number_used)

{

double average = compute_average(a, number_used);

cout « "Average of the " « number_used « " numbers = " « average « end! « "The numbers are: ";

for (int index = 0; index < number_used; index++)

cout « a[index] « " differs from average by " «

(a[index]-average) « endl; }

Большинство компиляторов выведет для данного кода сообщение об ошибке. Функ­ция compute_average не изменяет параметр а. Но когда компилятор анализирует оп­ределение функции show_diff егеnсе, он обнаруживает, что функция compute_average может изменять значение своего параметра типа массива. Это происходит пото­му, что во время обработки определения функции show_difference компилятору ничего не известно о функции compute_average, кроме ее объявления. В этом объяв­лении отсутствует квалификатор const, из чего следует, что для функции сотри-teaverage изменение параметра а не запрещено. Чтобы определение функции showdifference было откомпилировано без сообщений об ошибках, объявление функции compute_average должно быть таким:

double compute_average(const int a[], int number_used);

Функция не может вернуть массив тем же способом, каким она возвращает обыч­ные значения типа int или double. Однако возможность получения массива в ка­честве результирующего значения функции все же существует: нужно получить от функции указатель на массив. Но вы пока не можете написать функцию, возвращаю­щую указатель на массив, поскольку мы еще не рассматривали указатели. К этому вопросу мы вернемся в лекции 12.

ПРИМЕР

В качестве примера рассмотрим следующую функцию, принимающую массив, та­кой как page, и выводящую на экран его содержимое:

void display_page(const char p[][100], int size_dimension_1)

{

for (int index1 = 0;

index1 < int size_dimension_1; index1++) {

// Вывод одной строки:

for (int index2 = 0; index2 < 100; index2++)

cout « p[index1][index2]; cout « endl; } }