Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

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

Обратим внимание, что массивы всегда передаются по адресу – ведь имя массива − это адрес массива в памяти. Передача массивов по значению невозможна, очевидно, потому, что создавать копию массива в функции неэффективно.

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

int func(int a[10]){тело функции}

Для массивов переменного размера сам размер также передаётся как параметр, например:

int func(int a[], int n) {тело функции} // n – размер массива

Рекомендуемый способ основан на связи массивов и указателей, например:

int func(int *a, int n){тело функции}//имя массива – указатель на него

При передаче двумерного массива также возможны варианты, например:

int func(int a[10][20]){тело функции}

int func(int a[10][], int n){тело функции}// int a[][] – нельзя!!

Для динамически формируемого двумерного массива в виде массива указателей на массив указателей (см. главу 2) можно использовать такой вариант:

int func(int **a, int n, int m) {тело функции}

Пример передачи массива в функции будет рассмотрен далее (пример 1.15).

1.11.4 Параметры-константы

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

Обычно const используют для параметров, передаваемых по указателю или ссылке. В этом случае использование const — хороший способ передачи исходных данных в функцию (как альтернатива передаче по значению), т. к. при этом не требуется дополнительных затрат памяти для хранения копий параметров. Рекомендуется использовать этот способ для передачи параметров, которые занимают много места в памяти, например, для параметров типа string (например, const string &s), типов на основе vector (например, const vector<int> &x) или других сложных типов.

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

1.11.5 Значения параметров по умолчанию

При описании параметров, передаваемых по значению, можно указать их значения по умолчанию (например, int k=100). В этом случае при обращении к функции такие параметры можно опустить – они автоматически получат значения по умолчанию. Если потребуется задать значение параметра, отличное от значения по умолчанию, это значение нужно указать при обращении к функции. Надо запомнить, что параметры, для которых задаются значения по умолчанию, должны быть последними в списке формальных параметров.

В примере демонстрируются две функции – одна заполняет массив случайными числами в заданном диапазоне (границы диапазона задаются как параметры), по умолчанию размер массива равен 10. Вторая функция выводит массив на экран.

Обратите внимание, что значение по умолчанию задаётся только в прототипе функции.

//Пример 1.17 – функции для работы с одномерным массивом

#include <iostream>

#include <ctime>

using namespace std;

void rand_mas(int *, int , int , int =10);//заполнение массива

void show_mas(int *, int =10);//вывод массива

int main() {

// демонстрация работы функций

int a[10],b[20]; srand(time(0));

rand_mas(a,-10,10); //размер не указан – значит, он 10

rand_mas(b,0,100,20); //размер 20 указали явно

show_mas(a); show_mas(b,20);

system("pause"); return 0;

}

void rand_mas(int *x, int xmin, int xmax, int n){

for (int i=0; i<n; i++) x[i]=rand()%(xmax-xmin+1)+xmin;

}

void show_mas(int *x, int n){

for (int i=0; i<n; i++) cout<<x[i]<<' '; cout<<endl;

}

1.12 Дополнительные сведения о функциях в С++