710 Глава 12

ARRAYSIZE(A)

При передаче массива в функцию в качестве параметра заголовок функции со-
держит тип и имя массива с последующими пустыми квадратными скобками. На-
пример, если функция F должна принимать массив как параметр, ее прототип w
жет иметь вид:

void Flint Ar [] ) ;

Обращение к такой функции может быть записано так:

const Amax = 10;

int A[Amax];

F(A);

Как видно, в вызове функции указывается просто имя массива. Внутри функ-
ции к элементам этого массива можно обращаться обычным образом, например,
Аг[2]. C++ передает имя массива в функцию по ссылке (см. главу 11 раз-
дел 11.5.2). Это значит, что если функция изменяет значения элементов массива,
то изменяются элементы исходного массива, который передавался в функцию.

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

void F(int Ar[], int N) ;

а вызов функции:

F(A, Amax);

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

F(A, Amax - 1) ;

В частности, такого вызова требуют все функции Object Pascal, использующие
так называемый открытый массив. Поскольку подобные вызовы функции встреча-
ются довольно часто, в файле sysdefs.h определен макрос EXISTINGARRAY, ко-
торый позволяет оформить передачу массива более компактно. При использова-
нии этого макроса приведенный выше вызов можно оформить так:

F(EXISTINGARRAY(А)) ;

При развертывании макрос EXISTINGARRAY передаст в функцию имя мас-
сива как первый параметр и значение последнего индекса как второй параметр.
При этом макрос использует приведенные ранее выражение для подсчета числа
элементов массива через операцию sizeof.

Некоторые функции Object Pascal, используемые и в C++Builder, могут вос-
принимать в качестве параметров так называемые открытые массивы констант, в
которых могут содержаться элементы разных типов. В файле sysdefs.h описан
макрос OPEN ARRAY, позволяющий обращаться к таким функциям. Без дополни-
тельных разъяснении приведем форму записи такого макроса:

OPENARRAY(TVarRec, (элемент_1, элемент_2, ...))

Число передаваемых элементов может достигать 19.

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