Функции, возвращающие массивы
Резюме
Аргументом функции может быть целый массив, и тогда этот аргумент передается особым образом: не по ссылке и не по значению. Такие аргументы называются аргументами типа массива. Когда аргумент типа массива подставляется в параметр типа массива, функция получает единственное значение — адрес первого элемента массива в памяти (то есть элемента массива с индексом 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; } }