
- •Тема 5 Функции
- •5.1 Синтаксис функций
- •5.2 Типизированные и нетипизированные функции. Оператор return
- •5.3 Автоматические и статические локальные переменные, глобальные переменные
- •5.4 Способы передачи параметров функциям
- •5.5 Передача массивов функциям
- •5.6 Функции специального назначения
- •5.6.1 Встроенные функции (inline-функции)
- •5.6.2 Рекурсивные функции
- •5.7.1 Аргументы функций по умолчанию
- •5.7.2 Перегрузка функций
- •5.7.3 Перегрузка функций и неопределенность
5.5 Передача массивов функциям
В C++ по умолчанию массивы всегда передаются в функцию по ссылке. Это делается с целью экономии памяти, т.к. в случае копирования массива большой размерности память компьютера использовалась бы нерационально. Информацию о реальном количестве элементов массива всегда следует передавать через отдельный параметр. Для одномерного массива-параметра функции можно указать его максимальную размерность, которая должна быть предварительно объявлена как константа (фиксированный массив):
const int Nmax = 100;
int Func( int Mas[Nmax], int N ); // объявление функции
или просто не указывать размерность (открытый массив):
const int Nmax = 100;
int Func( int Mas[ ], int N ); // объявление функции
Второй вариант предпочтительнее, т.к. позволяет передавать в функцию одномерный массив любой размерности.
Приведём пример функции Summa(), которая вычисляет и возвращает сумму элементов массива. Блоки ввода и вывода одномерного массива также оформим в виде отдельных функций Input() и Output(). Реальная размерность массива N определяется внутри функции ввода Input() и должна быть возвращена в main(). Поэтому она передаётся через параметр-ссылку, чтобы функция могла изменить значение N. Что же касается функции Output(), то в этом случае размерность N передаётся по копии, поскольку в процессе вывода массива на экран его размерность не изменяется. Обе функции являются нетипизированными, т.к. сам массив и его размерность передаются и возвращаются обратно через параметры-ссылки.
const int Nmax = 100;
void Input( int Mas[ ], int &N ); // ввод массива
void Output( int Mas[ ], int N ); // вывод массива
int Summa( int Mas[ ], int N ); // сумма элементов массива
//---------------------------------------------------------------------------------
void main()
{
int Mas[Nmax];
int N;
Input( Mas, N ); // или Input( &Mas[0], N ); передаётся адрес 1-го элемента
Output( Mas, N );
printf( "\n\n Сумма элементов массива равна %5d", Summa( Mas, N ) );
getch();
}
//---------------------------------------------------------------------------------
void Input(int Mas[ ], int &N) // функция ввода массива
{
printf( "\n N = ");
scanf( "%d", &N );
for ( int i = 0; i < N; i++ )
{
printf( " Mas[%d] = ", i + 1 );
scanf( "%d", &Mas[i] );
}
}
//---------------------------------------------------------------------------------
void Output(int Mas[ ], int N) // функция вывода массива
{
printf("\n\n Massiv \n");
for ( int i = 0; i < N; i++ )
printf( "%5d", Mas[i] );
}
//---------------------------------------------------------------------------------
int Summa(int Mas[ ], int N); // сумма элементов массива
{
int S = 0;
for (int i = 0; i < N; i++)
S += Mas[i];
return S;
}
При передаче многомерных массивов все размерности, если они не известны на этапе компиляции, должны передаваться в качестве параметров-ссылок или параметров-копий в зависимости от того, будет ли функция их изменять или нет.